it-swarm-es.tech

¿Cómo insertar texto en un archivo propiedad de root usando sudo?

Posible duplicado:
Redirigiendo stdout a un archivo en el que no tiene permiso de escritura

Ejecutando un comando como Sudo echo 'text' >> /file.txt falla con:

bash: /file.txt: Permission denied
48
tshepang

Esto no funciona porque la redirección es ejecutada por el Shell, no por el comando al que se aplica. Pero su Shell no se ejecuta como root, solo echo 'text' es.

Un truco común cuando necesita tener permisos de root para escribir en un archivo, pero no para generar los datos, es usar tee:

echo 'text' | Sudo tee -a /file.txt

tee también imprime el texto en stdout. Para silenciarlo, se comporta de manera más similar a los anexos de Shell (>>), enruta el stdout a /dev/null:

echo 'text' | Sudo tee -a /file.txt > /dev/null

Si necesita permisos de root para generar los datos, puede ejecutar dos comandos Sudo, o ejecutar un Shell dentro de Sudo y hacer la redirección allí (cuidado con las citas).

Sudo echo 'text' | Sudo tee -a /file.txt
Sudo sh -c 'echo "text" >>/file.txt'

Al sobrescribir en lugar de agregar, si está acostumbrado a que su Shell se niegue a truncar un archivo existente con el > operador (set -o noclobber), recuerde que esta protección no se aplicará. Sudo sh -c 'echo >/etc/passwd' y Sudo tee /etc/passwd sobrescribirá /etc/passwd, necesitarías Sudo sh -o noclobber -c 'echo >/etc/passwd' para que la configuración noclobber también se aplique a la sh iniciada por Sudo.

Le está diciendo a bash que abra un archivo y añada la salida del comando Sudo echo 'text', lo que por supuesto no funciona ya que su bash se ejecuta como no root. Interactivamente, suelo ejecutar Sudo -s para evitar esto (desde entonces, Shell se ejecuta como root y puede abrir el archivo). Alternativamente, puede ejecutar Sudo sh -c "echo 'text' >> /file.txt", que también funciona, pero es un poco complicado con toda la interpolación/escape que puede interferir si tiene expresiones complicadas.

8
Thomas Themel