Cómo agregar una línea a un archivo que solo tiene permiso de escritura raíz y continuar la ejecución del script

9

Estoy tratando de aprender bash scripting. Estoy trabajando en un problema práctico y en un momento necesito agregar una línea a un archivo que requiere rootpermiso para escribir.

El código se ve así:

# some code
echo "add this line to the code" >> fileName
# some code

¿Es posible de alguna manera hacer que el script solicite la contraseña de root, valide la contraseña y, con una autenticación exitosa, modifique el archivo? La secuencia de comandos debería volver al modo de usuario y continuar la ejecución del comando.

Alex
fuente

Respuestas:

13

Hay un consejo en la sudopágina del manual que explica cómo hacer algo como esto. Aquí está mi frase:

#!/usr/bin/bash
sudo sh -c "echo \"add this line to the code\" >> fileName"

Obviamente, primero tendrá que configurar su usuario para que tenga sudoprivilegios. El shshell se usa debido a la redirección al archivo propiedad de la raíz. También tuve que escapar de las comillas utilizadas para el echocomando.

SigueSigueBen
fuente
2

su está disponible en la mayoría de los sistemas Unix y debería funcionar:

su root -c 'echo "add this line to the code" >> fileName'
milagro173
fuente
A diferencia de sudo, las contraseñas no parecen ser almacenadas en caché su.
Ryne Everett
@Ryne Everett: No estoy familiarizado con sudo. Pero el comportamiento de 'su' es realmente como lo necesita el script del OP. La mayoría de las veces uso 'su' al revés: cambiando de root a otro usuario. En este caso, no se necesita contraseña, por supuesto.
miracle173
1

Puedes usar teecon sudo:

echo "add this line to the code" | sudo tee -a filename > /dev/null

echoLa salida de 'se redirige con |( pipe ) a sudo tee. teelee de la entrada estándar y escribe en la salida estándar cualquier archivo dado, en este caso filename. -a(o --append) hace teeanexar a los archivos, sin ellos los archivos se sobrescribirán. A medida que teese ejecuta sudo, abre archivos con permisos de root. Finalmente, > /dev/nullsuprime teela salida a salida estándar .

Una ventaja de usar en teelugar de simplemente iniciar todo el comando, incluida la redirección con su -co sudo sh -ces, es que no tiene que cambiar la cita del comando inicial de ninguna manera (las líneas de cita que ya contienen citas pueden ponerse bastante feas a veces).

Adaephon
fuente
0

Pruebe esto Este comando está disponible en Unix y Linux.

sudo sh -c "echo 'add this line to the code' >> fileName"

JongYoung
fuente
-2

Haría el truco:

ssh host "sudo su root -c 'echo "add this line to the code" >> /etc/hosts'"
usuario1934677
fuente
¿Por qué ssh? No necesita sucon sudoy tampoco necesita especificar, rootya que es el valor predeterminado. Con todo, un poco más de explicaciones sería bueno ya que el OP quería aprender algo y no solo un problema resuelto.
Adaephon
Creo que tendrás problemas con las comillas dobles
milagro173