Pipe output to a file without permissions

Sometimes you want to redirect the output of a command into a file that you don't own.

$ ls -al /tmp/root_owns_this
-rw-r----- 1 root wheel 10 Aug 21 09:06 /tmp/root_owns_this
$ echo "test" > /tmp/root_owns_this
-bash: /tmp/root_owns_this: Permission denied

Your first instinct may be to simply use sudo:

$ sudo echo "test" > /tmp/root_owns_this
-bash: /tmp/root_owns_this: Permission denied

Same error. Why? Because sudo is only elevating the privileges of the echo command. The redirect still belongs to your shell.

I'm aware of two options to get around this, although I'm sure there are others.

$ echo "test" | sudo tee /tmp/root_owns_this # Create/overwrite the file
test
$ echo "test" | sudo tee -a /tmp/root_owns_this # Append to the file
test

or

$ sudo bash -c "echo \"test\" > /tmp/root_owns_this" # Create/overwrite the file
$ sudo bash -c "echo \"test\" >> /tmp/root_owns_this # Append to the file

The downside to the first option is that tee is going to echo anything piped to it to STDOUT. You can work around this by redirecting STDOUT to /dev/null. The potential downside to the second option is properly escaping the commands within the call to bash.

Comments

Popular posts from this blog

SSH Private Keys - RSA vs. OpenSSH

Google Wifi and Verizon FiOS