Possible Duplicate:
Redirecting stdout to a file you don't have write permission on

Yeah I could (and probably will) just escalate to root, but I'd like to know why this doesn't work?

sudo cat .mplayer/config >> /home/griff/.mplayer/config
zsh: permission denied: /home/griff/.mplayer/config

sudo is configured to be able to run any command, I've placed no restrictions on it.


As answered by msw before, this happens because >> happens before the actual command execution and does not run with the elevated sudo privileges.

An alternative way to do this, is to wrap the entire command in another bash command shell:

sudo bash -c "cat .mplayer/config >> /home/griff/.mplayer/config"

This will start a new bash shell with sudo privileges and closes it after executing the command.


This fails because the redirection >> is always done before the execution of the command regardless of the command.

In this case, the shell is running as you (not root) and tries to append to the .../config file using your current permissions, not root's, and fails before sudo even runs.

A common metaphor for doing what your command intends is:

sudo tee --append /home/griff/.mplayer/config < .mplayer/config

(assuming that you have read permission for .mplayer/config). Because /home/griff/... is opened by tee in the root context of sudo, it has root permissions to write that file.

I'm not wild about this approach as it copies the contents of .mplayer/config to the standard output - along with appending it to griff's file - but it does work.



sudo is capable of running any command

do you mean that conceptually sudo can be configured to run any command or that you have configured sudo on the system in question as, roughly, <user> <host(s)>=<opt(s)> ALL?

Have you tried sudo -u 0 cat ...? This would force sudo to execute the command as root, provided that your user id is allowed to do so.

What does sudo -l print?

  • no I meant that I haven't restricted its ability to run commands, which sudo is capable of. – xenoterracide Dec 14 '10 at 14:02
  • User xenoterracide may run the following commands on this host: (ALL) NOPASSWD: ALL # waits for lynchmob – xenoterracide Dec 14 '10 at 14:04

Not the answer you're looking for? Browse other questions tagged or ask your own question.