![]() |
sudo and >>: permission denied
I ran into this interesting problem today. I have the following directory:
drwxr-xr-x 2 mcd mcd 168 2008-06-25 12:05 . drwxr-xr-x 23 mcd mcd 1360 2008-06-25 12:04 .. -rw-r--r-- 1 root root 15883 2008-06-25 12:05 dmesg.txt -rw-r--r-- 1 root root 655133 2008-06-25 12:05 messages.txt -rw-r--r-- 1 root root 0 2008-06-25 12:05 out -rw-r--r-- 1 mcd mcd 2114 2008-06-25 12:05 update.txt These are test files I just created. Now, I want to cat the contents of the text files and append them to out: $ sudo cat *.txt >> out Only I get permission denied: -bash: out: Permission denied It's the same if I try these: $ sudo cat *.txt > out $ sudo cat *.txt | sudo >> out But if I su to root, and then just run cat *.txt >> out it works just fine. So it seems like the change of identity does not "propagate" past the >>. Sudo's man page doesn't help me understand this any better. Does anyone have any insight into what's actually going on here? Thanks, McD |
Actually the man page DOES say you have to run it in a subshell to allow redirection to work (or gives an example that tells you that):
Quote:
So to do what you want you just need to modify your command line: sudo sh -c "cat *.txt >> out" |
Command:
sudo cat *.txt >> out The shell you're using interprets this as. Run command: sudo cat *.txt # Elevates privs Then take the output and put it into file out. The first part is run as root 'cat *.txt' then your shell, running as you and outside of the sudo escalated privs, tries to open a file 'out' and put the output in it. Thus the permission denied. Hopefully this made a tiny bit more sense to you. The subshell example above in this thread should fix it as well. |
| All times are GMT -5. The time now is 12:28 PM. |