usuario - tuberias y filtros en linux




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

¿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.


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 [email protected] > /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.


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

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


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 > ).





permission-denied