13

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.

xenoterracide
  • 59,188
  • 74
  • 187
  • 252

3 Answers3

21

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.

10

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.

msw
  • 10,593
0

By

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?

Tok
  • 10,744