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.

3
  • I remember an old question asking how to use sudo just like this... Commented Dec 14, 2010 at 14:46
  • 1
    here it is unix.stackexchange.com/q/1416/250 Commented Dec 14, 2010 at 14:47
  • @phunhehe++ I didn't know this had been asked Commented Dec 14, 2010 at 15:18

3 Answers 3

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.

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?

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.