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

hsribei
fuente
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.
akira
fuente
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"
Ignacio Vazquez-Abrams
fuente
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)

Doug Harris
fuente
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
Nicholas Sushkin
fuente
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
user316693
fuente
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
Bobby
fuente
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.

innaM
fuente
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.

kenorb
fuente