Search code examples
linuxbashpermissionssudoio-redirection

How do I use sudo to redirect output to a location I don't have permission to write to?


I've been given sudo access on one of our development RedHat linux boxes, and I seem to find myself quite often needing to redirect output to a location I don't normally have write access to.

The trouble is, this contrived example doesn't work:

sudo ls -hal /root/ > /root/test.out

I just receive the response:

-bash: /root/test.out: Permission denied

How can I get this to work?


Solution

  • Your command does not work because the redirection is performed by your shell which does not have the permission to write to /root/test.out. The redirection of the output is not performed by sudo.

    There are multiple solutions:

    • Run a shell with sudo and give the command to it by using the -c option:

      sudo sh -c 'ls -hal /root/ > /root/test.out'
      
    • Create a script with your commands and run that script with sudo:

      #!/bin/sh
      ls -hal /root/ > /root/test.out
      

      Run sudo ls.sh. See Steve Bennett's answer if you don't want to create a temporary file.

    • Launch a shell with sudo -s then run your commands:

      [nobody@so]$ sudo -s
      [root@so]# ls -hal /root/ > /root/test.out
      [root@so]# ^D
      [nobody@so]$
      
    • Use sudo tee (if you have to escape a lot when using the -c option):

      sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
      

      The redirect to /dev/null is needed to stop tee from outputting to the screen. To append instead of overwriting the output file (>>), use tee -a or tee --append (the last one is specific to GNU coreutils).

    Thanks go to Jd, Adam J. Forster and Johnathan for the second, third and fourth solutions.