Using sudo and redirecting output to a file


Sudo is a cool tool to have under your belt.

If you, as a UNIX/Linux sysadmin does not know how to use sudo, get a new job.

I have heard excuses for not using sudo so many times, that if I was given a penny every time I would at least be able to buy myself a coffee. At Starbucks. This behavior usually ends up with an anonymous user account with a very poor password, often shared between way too many people. I’ve heard:

  • It takes too long time to write all that crap. -> No it doesn’t, unless you lack 9 fingers.
  • Sudo does not allow me to do what I want to do. -> Yes it does, you just have not learned how to, yet.

And lastly:

  • It is impossible to redirect output into a file when using sudo.

sudo

Almost… I have to admit, it took me some time to figure that one out. And until then, I took it as a good excuse for doing a “sudo su -“. Here is a simple example: you would like to transform the output from one command and store it in a file, as root, in a directory where you have no permission to write.

Example:

[ccne lines=”0″]

USERNAME@MYHOSTNAME:/var $sudo cat /etc/shadow | cut -d”:” -f 1 > /var/test.file
-bash: /var/test.file: Permission denied
[/ccne]

This is because both the redirection (the | and > signs) will be parsed by _your_ shell, which is _you_. Both the “cut” command, and the redirection into /var/test.file will be executed as yourself, not root.

The solution is simple. And it is easy. Just run the whole thing using “sh -c”

[ccne lines=”0″]

USERNAME@MYHOSTNAME:/var $sudo sh -c “cat /etc/shadow | cut -d”:” -f 1 > /var/test.file”
USERNAME@MYHOSTNAME:/var $ls -la /var/test.file
-rw-r–r– 1 root root 156 Jan 30 18:37 /var/test.file
[/ccne]

One excuse less for not using sudo.  Rock on!

Related Posts