usuario tuberias salida redirigir redireccionamiento guardar filtros fichero etc ejemplos ejemplo comando archivo agregar linux permissions sudo io-redirection permission-denied

linux - tuberias - sudo-i comando



¿Cómo uso sudo para redirigir la salida a una ubicación en la que no tengo permiso para escribir? (15)

¿Qué hay de escribir un guión?

Nombre de archivo: myscript

#!/bin/sh /bin/ls -lah /root > /root/test.out # end script

Luego usa sudo para ejecutar el script:

sudo ./myscript

Me dieron acceso a sudo en una de nuestras cajas RedHat Linux de desarrollo, y me parece que a menudo necesito redirigir la salida a una ubicación a la que normalmente no tengo 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?


¿Tal vez le han dado acceso a sudo solo a algunos programas / rutas? Entonces no hay manera de hacer lo que quieres. (A menos que lo hackees de alguna manera)

Si no es el caso, entonces tal vez puedas escribir un script bash:

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

Presione ctrl + d :

chmod a+x myscript.sh sudo myscript.sh

Espero que te ayude.


Alguien aquí acaba de sugerir sudoing tee:

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

Esto también podría usarse para redirigir cualquier comando a un directorio al que no tiene acceso. Funciona porque el programa tee es efectivamente un programa de "eco a un archivo", y el redireccionamiento a / dev / null es para que se detenga y salga a la pantalla para mantenerlo igual que el ejemplo original creado anteriormente.


Aquí hay una extensión de la respuesta que implica tee. Para facilitar las cosas, le gustaría hacer un pequeño script (lo llamo suwrite o lo puede llamar sutee) y ponerlo en / usr / local / bin / con + x permiso:

#! /bin/sh sudo tee $@ > /dev/null

Ahora todo lo que tiene que hacer es canalizar la salida a esta secuencia de comandos seguida del nombre de archivo deseado accesible al superusuario y le pedirá automáticamente su contraseña si es necesario (ya que incluye sudo).

echo test | suwrite /root/test.txt

Tenga en cuenta que, dado que se trata de un envoltorio simple para tee, también aceptará la opción -a de tee (o cualquier otra opción) para adjuntarla al archivo deseado que acaba de pasar -a:

echo test | suwrite -a /root/test.txt


Cada vez que tengo que hacer algo como esto, simplemente me convierto en root:

# sudo -s # ls -hal /root/ > /root/test.out # exit

Probablemente no sea la mejor manera, pero funciona.


El problema es que el comando se ejecuta bajo sudo , pero la redirección se ejecuta bajo su usuario. Esto lo hace el shell y hay muy poco que puedas hacer al respecto.

sudo command > /some/file.log `-----v-----''`-------v-------'' command redirection

Las formas habituales de eludir esto son:

  • Envuelve los comandos en una secuencia de comandos que llamas bajo sudo.

    Si los comandos y / o el archivo de registro cambian, puede hacer que el script los tome como argumentos. Por ejemplo:

    sudo log_script command /log/file.txt

  • Llame a un shell y pase la línea de comando como parámetro con -c

    Esto es especialmente útil para comandos compuestos únicos. Por ejemplo:

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"


Haz que sudo ejecute un shell, como este:

sudo sh -c "echo foo > ~root/out"


La forma en que trataría este tema es:

Si necesita escribir / reemplazar el archivo:

echo "some text" | sudo tee /path/to/file

Si necesita adjuntar al archivo:

echo "some text" | sudo tee -a /path/to/file


Lo haría de esta manera:

sudo su -c ''ls -hal /root/ > /root/test.out''


No intente vencer a un caballo muerto, pero hay demasiadas respuestas aquí que usan tee , lo que significa que tiene que redirigir la tee stdout a /dev/null menos que quiera ver una copia en la pantalla. Una solución más simple es usar cat como esto:

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

Observe cómo la redirección se coloca entre comillas para que sea evaluada por un shell iniciado por sudo lugar del que lo ejecuta.


Otra variación más 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 necesitas recordar ningún argumento para sudo o sh / bash


Su comando no funciona porque la redirección la realiza su shell, que no tiene permiso para escribir en /root/test.out . La redirección de la salida no se realiza por sudo.

Hay múltiples soluciones:

  • Ejecuta un shell con sudo y dale el comando usando la opción -c :

    sudo sh -c ''ls -hal /root/ > /root/test.out''

  • Cree un script con sus comandos y ejecute ese script con sudo:

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

    Ejecutar sudo ls.sh Consulte la answer Steve Bennett si no desea crear un archivo temporal.

  • Ejecuta un shell con sudo -s luego ejecuta tus comandos:

    [nobody@so]$ sudo -s [root@so]# ls -hal /root/ > /root/test.out [root@so]# ^D [nobody@so]$

  • Use sudo tee (si tiene que escapar mucho al usar la opción -c ):

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

    La redirección a /dev/null es necesaria para evitar que el tee salga a la pantalla. Para agregar en lugar de sobrescribir el archivo de salida ( >> ), use tee -a o tee --append (el último es específico de los núcleos básicos de GNU ).

Gracias a Jd , Adam J. Forster y Johnathan por las soluciones segunda, tercera y cuarta.


Un truco que me di cuenta era

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


Aclarando un poco por qué la opción de tee es preferible

Suponiendo que tiene el permiso adecuado para ejecutar el comando que crea la salida, si canaliza la salida de su comando para dar el primer paso, solo necesita elevar los privilegios de tee con sudo y dirigir el tee para escribir (o adjuntar) al archivo en cuestión.

en el ejemplo dado en la pregunta que significaría:

ls -hal /root/ | sudo tee /root/test.out

Para un par de ejemplos más prácticos:

# kill off one source of annoying advertisements echo 127.0.0.1 ad.doubleclick.net | sudo tee -a /etc/hosts # configure eth4 to come up on boot, set IP and netmask (centos 6.4) echo -e "ONBOOT=/"YES/"/nIPADDR=10.42.84.168/nPREFIX=24" | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth4

En cada uno de estos ejemplos, toma la salida de un comando sin privilegios y escribe en un archivo que normalmente solo se puede escribir por root, que es el origen de su pregunta.

Es una buena idea hacerlo de esta manera porque el comando que genera la salida no se ejecuta con privilegios elevados. No parece importar aquí con echo pero cuando el comando fuente es un script en el que no confías por completo, es crucial.

Tenga en cuenta que puede usar la opción -a para añadir el apéndice (como >> ) al archivo de destino en lugar de sobrescribirlo (como > ).


sudo at now at> echo test > /tmp/test.out at> <EOT> job 1 at Thu Sep 21 10:49:00 2017