sudo echo “algo” >> / etc / privilegedFile no funciona … ¿hay alguna alternativa?

Esta es una pregunta bastante simple, al menos parece que debería ser, sobre los permisos sudo en Linux.

Hay muchas veces en las que solo quiero agregar algo a /etc/hosts o un archivo similar, pero no puedo porque no se permiten tanto > como >> , incluso con root.

¿Hay alguna manera de hacer que esto funcione sin tener que su o sudo su en la raíz?

Use tee --append o tee -a .

 echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list 

Asegúrese de evitar las cotizaciones dentro de las cotizaciones.

Para evitar la impresión de datos en la consola, redirija la salida a / dev / null.

 echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list > /dev/null 

El problema es que el intérprete de comandos produce una redirección de salida, no sudo o echo, por lo que esto se realiza como su usuario habitual.

Prueba el siguiente fragmento de código:

 sudo sh -c "echo 'something' >> /etc/privilegedfile" 

El problema es que es su shell el que maneja la redirección; está intentando abrir el archivo con sus permisos, no con los del proceso que está ejecutando bajo sudo.

Use algo como esto, tal vez:

 sudo sh -c "echo 'something' >> /etc/privilegedFile" 
 sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts" 

Obra

 sudo sh -c "echo >> somefile" 

Deberia trabajar. El problema es que> y >> son manejados por su shell, no por el comando “sudoed”, por lo que los permisos son los suyos, no los del usuario al que está “haciendo sudo”.

Me gustaría señalar, para los curiosos, que también se puede citar un heredoc (para bloques grandes):

 sudo bash -c "cat <> /etc/ipfw.conf    Label com.company.ipfw Program /sbin/ipfw ProgramArguments  /sbin/ipfw -q /etc/ipfw.conf  RunAtLoad    EOIPFW" 

En bash, puede usar tee en combinación con > /dev/null para mantener el stdout limpio.

  echo "# comment" | sudo tee -a /etc/hosts > /dev/null 

Usando la respuesta de Yoo , pon esto en tu ~/.bashrc :

 sudoe() { [[ "$#" -ne 2 ]] && echo "Usage: sudoe  " && return 1 echo "$1" | sudo tee --append "$2" > /dev/null } 

Ahora puede ejecutar sudoe 'deb blah # blah' /etc/apt/sources.list


Editar:

Una versión más completa que le permite canalizar la entrada o redirigir desde un archivo e incluye un interruptor -a para desactivar el anexar (que está activado por defecto):

 sudoe() { if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then shift &>/dev/null || local failed=1 else local append="--append" fi while [[ $failed -ne 1 ]]; do if [[ -t 0 ]]; then text="$1"; shift &>/dev/null || break else text="$(cat <&0)" fi [[ -z "$1" ]] && break echo "$text" | sudo tee $append "$1" >/dev/null; return $? done echo "Usage: $0 [-a|--no-append] [text] "; return 1 } 

También puede usar una sponge del paquete moreutils y no necesita redirigir la salida (es decir, sin ruido de tee para esconderse):

 echo 'Add this line' | sudo sponge -a privfile 

Esto funcionó para mí: comando original

 echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment 

Comando de trabajo

 echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment 

Al usar sed -i con $ a , puede agregar texto, que contiene tanto variables como caracteres especiales, después de la última línea.

Por ejemplo, agregando $ NEW_HOST con $ NEW_IP a / etc / hosts:

 sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts 

Opciones de sed explicadas:

  • -i para en el lugar
  • $ para la última línea
  • un para anexar

¿Puedes cambiar la propiedad del archivo y luego volver a cambiarlo después de usar cat >> para agregar?

 sudo chown youruser /etc/hosts sudo cat /downloaded/hostsadditions >> /etc/hosts sudo chown root /etc/hosts 

Algo como esto funciona para ti?