Pregunta ¿Cómo anexar a un archivo como sudo?


Posible duplicado:
sudo no puede escribir en / etc / profile 

Quiero hacer:

echo "something" >> /etc/config_file

Pero, dado que solo el usuario raíz tiene permiso de escritura para este archivo, no puedo hacer eso. Pero lo siguiente tampoco funciona.

sudo echo "something" >> /etc/config_file

¿Hay alguna manera de anexar a un archivo en esa situación sin tener que abrirlo primero con un sudo'd editor y luego agregar el nuevo contenido a mano?


219


origen


Estoy usando Ubuntu 9.04 y puedo usar sudo para cada comando que he necesitado hasta ahora. Engendrar un subconjunto funcionó. - Matt Norris
Fuertemente relacionado: Redireccionando stdout a un archivo que no tiene permiso de escritura en(en Unix y Linux). Débilmente relacionado: ls con la ruta del directorio muestra archivos, pero ls con el patrón de archivo no? - Scott


Respuestas:


La herramienta adecuada para la tarea correcta: 'tee'

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

Entonces su línea de comando se convierte

% echo "output" | sudo tee -a file

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

  • No ejecuta Bash con permisos administrativos
  • Solo la parte 'write to file' se ejecuta con permisos avanzados
  • Citar un comando complejo es mucho más fácil

327



En el sistema operativo OS X solo parece tener un indicador -a. - user495470
Debian 8 tee tiene el -a agregar bandera. - clay
Utilizar echo "output" | sudo tee -a file > /dev/null si quieres saltear la salida de la consola. - Moshe Bixenshpaner
Funciona bien para WSL también. - kayleeFrye_onDeck


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

sudo bash -c "somecommand >> somefile"

38





Haga que sudo engendre un subconjunto:

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)


22



La razón es que es su caparazón (que se ejecuta como usted) lo que hace la redirección, no sudo. Como no tiene permiso para escribir en el archivo, obtiene 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 uno mejor, por la lógica provista en esa respuesta. - TOOGAM


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

4





Usualmente uso shell AQUÍ documento con sudo tee -a. Algo como:

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





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

sudo nano /etc/profile

O bien, podrías intentar con su

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

3



Desafortunadamente, esto produjo el mismo resultado. - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' Deberia trabajar. dado que no hay nada que el shell pueda expandir por error en el arg a echo, comilla simple del comando general. - quack quixote
Eso es fantástico. Ahora haz esto como parte de un script. - Ernie Dunbar


Esto no funcionará, está intentando redirigir (utilizando >>) 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 para /etc/profile. Esto tiene el beneficio adicional de que puede verificar si /etc/profile ya establece JAVA_HOME.


0





Utilizar ex-camino:

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

y reemplazar FOO con tu variable para anexar

En algunos sistemas (como OS X), el /etc/profile El archivo tiene 444 permisos, por lo que si aún obtiene Permiso denegado, verifique y corrija primero el permiso:

sudo chmod 644 /etc/profile

vuelva a intentarlo.


0