it-swarm.dev

sudo echo "algo" >>/etc/privilegedFile no funciona

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

Hay muchas veces en las que solo quiero agregar algo a /etc/hosts o un archivo similar pero no puedo hacerlo porque > y >> no están permitidos, incluso con root.

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

527
David

Utilice tee --append o tee -a.

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

Asegúrese de evitar comillas dentro de comillas.

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

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

El problema es que el Shell realiza la redirección de salida, no Sudo o eco, por lo que esto se hace como su usuario habitual.

Pruebe el siguiente fragmento de código:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
291
Matt P

El problema es que es tu Shell el que maneja la redirección; está intentando abrir el archivo con sus permisos no los del proceso que está ejecutando bajo Sudo.

Use algo como esto, tal vez:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

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á "sudoing".

13
agnul

Me gustaría señalar, para los curiosos, que también puede citar un 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"
9
msanford

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

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8
Vytenis Bivainis

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 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 agregado (que está activado 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
}
4
hololeap

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

echo 'Add this line' | Sudo sponge -a privfile
2
Michael Goldshteyn

echo 'Hola Mundo' | (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty