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 (>>
), usetee -a
otee --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