it-swarm-pt.tech

sudo echo "alguma coisa" >> / etc / privilegedFile não funciona

Esta é uma pergunta bem simples, pelo menos parece que deveria ser, sobre as permissões do Sudo no Linux.

Muitas vezes eu só quero acrescentar algo a /etc/hosts ou um arquivo similar, mas acabo não sendo possível porque > e >> não são permitidos, mesmo com root.

Existe alguma maneira de fazer isso funcionar sem ter que su ou Sudo su na raiz?

529
David

Use tee --append ou tee -a.

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

Certifique-se de evitar citações dentro de cotações.

Para evitar a impressão de dados no console, redirecione a saída para/dev/null.

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

O problema é que o Shell faz o redirecionamento de saída, não o Sudo ou o echo, então isso está sendo feito como seu usuário comum.

Experimente o seguinte trecho de código:

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

A questão é que é o seu Shell que lida com o redirecionamento; ele está tentando abrir o arquivo com as permissões se não aquelas do processo que você está executando sob o Sudo.

Use algo assim, talvez:

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

Fazendo

Sudo sh -c "echo >> somefile"

deveria trabalhar. O problema é que> e >> são manipulados pelo seu Shell, não pelo comando "sudoed", portanto as permissões são suas, não as do usuário em que você está "sudoing".

13
agnul

Gostaria de observar, para os curiosos, que você também pode citar um heredoc (para grandes blocos):

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

No bash você pode usar tee em combinação com > /dev/null para manter o stdout limpo.

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

Usando resposta de Yoo , coloque isso em seu ~/.bashrc:

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

Agora você pode executar sudoe 'deb blah # blah' /etc/apt/sources.list


Edit:

Uma versão mais completa que permite canalizar entrada ou redirecionar de um arquivo e inclui um switch -a para desativar o appending (que é ativado por padrão):

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

Você também pode usar sponge do pacote moreutils e não precisa redirecionar a saída (ou seja, sem tee noise para ocultar):

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

eco 'Olá mundo' | (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty