¿Cómo adjuntar a un archivo sudo?


243

Quiero hacer:

echo "something" >> /etc/config_file

Pero, como solo el usuario root tiene permiso de escritura para este archivo, no puedo hacer eso. Pero lo siguiente tampoco funciona.

sudo echo "something" >> /etc/config_file

¿Hay una manera de adjuntar a un archivo en esa situación sin tener que abrirlo primero con un sudo ¿Editor y luego añadir el nuevo contenido a mano?


Estoy usando Ubuntu 9.04 y puedo usar sudo para cada comando que he necesitado hasta ahora. Engendrando un sub-shell trabajado.
Matt Norris

Respuestas:


355

La herramienta adecuada para la tarea correcta: tee '

tee - read from standard input and write to standard output and files

Así que tu línea de comando se convierte en

% echo "output" | sudo tee -a file

La ventaja de tee sobre ejecución de Bash con permisos administrativos es:

  • No ejecuta Bash con permisos administrativos.
  • Solo la parte 'escribir en archivo' se ejecuta con permisos avanzados
  • Citar un comando complejo es mucho más fácil.

2
En OS X tee solo parece tener una bandera -a.
Lri

Debian 8 tee tiene el -a añadir bandera
clay

5
Utilizar echo "output" | sudo tee -a file > /dev/null Si desea omitir la salida de la consola.
Moshe Bixenshpaner

Funciona bien para WSL también.
kayleeFrye_onDeck

43

La redirección se ejecuta en el shell actual. Para realizar la redirección con privilegios elevados, debe ejecutar el shell en sí con privilegios elevados:

sudo bash -c "somecommand >> somefile"

23

Haga que sudo genere un sub-shell:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

En este ejemplo, sudo ejecuta "sh" con el resto como argumentos.

(Esto se muestra como un ejemplo en la página man de sudo)


8
La razón es que es su shell (ejecutándose como usted) que hace la redirección, no sudo. Como no tiene permiso para escribir en el archivo, aparece el error Permiso denegado. Lo que hace esta respuesta es iniciar un nuevo shell que se ejecuta como root y, por lo tanto, puede escribir en el archivo.
Randy Orrison

Esta no es la respuesta correcta. Esta es una respuesta correcta. Akira tiene una mejor, por la lógica proporcionada en esa respuesta.
TOOGAM

6

Por lo general uso documento de shell AQUI con sudo tee -a . Algo a lo largo de las líneas de:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4

En mi opinión, lo mejor en este caso es dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

Puede haber un problema con el sudo aquí y con la redirección. Utilice un editor de texto de su elección para agregar la línea.

sudo nano /etc/profile

O bien, podría probar su lugar

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

Desafortunadamente, esto produjo el mismo resultado.
Matt Norris

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' Deberia trabajar. ya que no hay nada que el shell pueda expandir erróneamente en el argumento para hacer eco, solo tiene que citar el comando general.
quack quixote

Eso es fantástico. Ahora haz esto como parte de un script.
Ernie Dunbar

0

Esto no funcionará si intenta redirigir (usando >> ) la salida de sudo. Lo que realmente quieres hacer es redirigir la salida de echo. Le sugiero que simplemente use su editor favorito y agregue esa línea manualmente a /etc/profile. Esto tiene el beneficio adicional que puede comprobar si /etc/profile ya establece JAVA_HOME.


0

Utilizar ex -camino:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

y reemplazar FOO con su variable para anexar.

En algunos sistemas (como OS X), el /etc/profile El archivo tiene 444 permisos, por lo que si todavía obtienes Permiso denegado , compruebe y corrija el permiso primero:

sudo chmod 644 /etc/profile

vuelva a intentarlo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.