424 votos

¿Cómo puedo utilizar sudo para redirigir la salida a un lugar que no tengo permiso para escribir?

Me han dado acceso sudo en una de nuestras cajas de Linux RedHat desarrollo, y me parece que me encuentro muy a menudo necesidad de redirigir la salida a un lugar que normalmente no tienen acceso de escritura.

El problema es que este ejemplo artificial no funciona:

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

Acabo de recibir la respuesta:

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

¿Cómo puedo conseguir que esto funcione?

597voto

Cristian Ciupitu Puntos 5692

El comando no funciona ya que la redirección se realiza por su concha que no tiene permiso para escribir en /root/test.out. El redireccionamiento de la salida no se realiza por el uso de sudo.

Hay varias soluciones:

  • Ejecutar un shell con sudo y dar la orden mediante el uso de la -c opción:

    sudo sh -c 'ls -hal /root/ > /root/test.out'
    
  • Crear un script con los comandos y ejecute la secuencia de comandos con sudo:

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

    Ejecutar sudo ls.sh. Ver a Steve Bennett respuesta si no desea crear un archivo temporal.

  • Lanzar un shell con sudo -s , a continuación, ejecute los comandos:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
    
  • Uso sudo tee (si usted tiene que escapar de un lote cuando se utiliza la -c opción):

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

    La redirección a /dev/null que se necesita para detener el tee de salida a la pantalla. Para anexar en lugar de sobrescribir el archivo de salida, utilice tee -a o tee --append.

Gracias a Jd, Adam J. Forster y Johnathan para el segundo, tercer y cuarto soluciones.

51voto

Jonathan Puntos 6934

Alguien aquí sólo ha sugerido tee sudoing:

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

Esto también podría ser utilizado para redirigir cualquier comando, en un directorio que no tiene acceso. Funciona porque el programa camiseta es efectivamente un programa de "echo a un archivo", y la redirección a / dev / null es detener también la salida a la pantalla para evitar que el mismo que el ejemplo artificioso origen encima.

36voto

rhlee Puntos 1177

Un truco que descubrí a mí mismo era

 sudo ls -hal /root/ | sudo dd of=/root/test.out
 

27voto

dsm Puntos 7429

El problema es que el comando se ejecute en virtud sudo, pero la redirección se ejecuta bajo el usuario. Esto se hace por el shell y hay muy poco que podamos hacer al respecto.

[dsm@localhost:~]$ sudo command > /some/file.log
                   `-----v-----'`-------v-------'
                      command        redirect

Las formas usuales de la omisión de esta son:

  • Envoltura de los comandos en un script que llame a bajo sudo.
    Si los comandos y/o archivo de registro de cambios, puede hacer que el secuencia de comandos de tomar estos como argumentos. Por ejemplo:
    sudo log_script command /log/file.txt
  • Llamar a un shell y pasar la línea de comandos como parámetro con `c`
    Esto es especialmente útil para uno compuesto de comandos. Por ejemplo:
    sudo bash -c "{ command1 arg ; command2 arg ; } > /log/file.txt;"

9voto

Steve Bennett Puntos 4273

Otra variación sobre el tema:

 sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF
 

O, por supuesto:

 echo 'ls -hal /root/ > /root/test.out' | sudo bash
 

Tienen la (pequeña) ventaja de que no es necesario recordar los argumentos a sudo o sh / bash

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: