Pregunta

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

Hay muchas ocasiones en las que solo quiero agregar algo a /etc/hosts o un archivo similar pero al final no puedo porque ambos > y >> no están permitidos, ni siquiera con root.

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

¿Fue útil?

Solución

Usar tee --append o tee -a.

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

Asegúrese de evitar las comillas entre comillas.

Para evitar imprimir datos en la consola, redirija la salida a /dev/null.

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

Otros consejos

El problema es que el shell genera redirección, no sudo o echo, por lo que esto se hace como su usuario habitual.

Pruebe 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 su permisos, no los del proceso que estás ejecutando en sudo.

Utilice algo como esto, tal vez:

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

Haciendo

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 suyos, no los del usuario al que está "sudoando".

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

sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"

En bash puedes usar tee en combinación con > /dev/null para mantener limpio el estándar.

 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 <text> <file>" && return 1
    echo "$1" | sudo tee --append "$2" > /dev/null
}

Ahora puedes correr sudoe 'deb blah # blah' /etc/apt/sources.list


Editar:

Una versión más completa que le permite canalizar entradas o redirigir desde un archivo e incluye una -a cambie para desactivar la adición (que está activada de forma predeterminada):

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] <file>"; return 1
}

También puedes usar sponge desde el moreutils paquete y no es necesario redirigir la salida (es decir, no tee ruido para ocultar):

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

Echo 'Hello World' | (sudo tee -a /etc/apt/sources.list)

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

Mediante el uso sed -i con $ un , puede agregar texto que contenga variables y 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 sed explicadas:

  • -i para en el lugar
  • $ para la última línea
  • a para agregar

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

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

¿Algo como esto te funciona?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top