Redirecionar a saída usando 'sudo' [duplicado]

27

Tenho uma pequena pergunta sobre o uso de sudo com o redirecionamento de saída > . Para habilitar o IP forwrding, alguém pode usar o comando:

echo 1 > /proc/sys/net/ipv4/ip_forward

A execução desse comando concederá permissão negada, pois exige privilégios de root. No entanto, a execução do mesmo comando com sudo também dá permissão negada erro! Parece que o redirecionamento de saída > não herda as permissões do comando anterior echo . Está certo?

Como solução alternativa:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Esta é a melhor maneira de fazer isso? Estou faltando alguma coisa?

Por favor, note que este é um exemplo e se aplica a todos os comandos que usam o redirecionamento de saída.

    
por Khaled 08.01.2011 / 10:20

3 respostas

26

Sua abordagem com sudo tee está bem. Uma boa consequência do uso de sudo tee é que o comando executado antes do pipe não será executado como root. Isso é útil se você precisar apenas da saída de um programa, que não requer privilégios de root.

Se você não se importa com a saída do programa usado antes do pipe ( echo 1 neste caso), redirecione o stdout para /dev/null :

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null

O acima é equivalente a sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' com a diferença de que echo 1 é executado como root.

Se você precisar anexar a um arquivo privilegiado, use sh -c 'echo 127.0.0.1 local.host >> /etc/hosts' ou:

echo 127.0.0.1 local.host | sudo tee -a /etc/hosts

Observe o -a , que é uma abreviação de --append .

    
por Lekensteyn 08.01.2011 / 12:03
8

Uma solução é usar:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

mas este não herda as propriedades env do shell pai, então você não pode usá-lo por exemplo com echo $PATH para obter o mesmo resultado que você teria em seu shell pai (é claro que apenas no caso de você altere sua propriedade de caminho).

Usar sudo -E preservará as variáveis ​​de ambiente.

Além disso, de acordo com o Google , seria melhor usar sh (que é um link simbólico para dash ), em vez de invocar isso com bash .

Então, você pode reescrever isso como:

sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
    
por Michal Bernhard 08.01.2011 / 10:50
6

Eu costumo usar o truque sudo bash -c , ou apenas sudo -s primeiro para ficar root, então execute o comando de redirecionamento.

O motivo pelo qual ele não funciona da primeira maneira é que o shell processa o redirecionamento primeiro e, em seguida, executa sudo . Como seu shell não tem acesso ao arquivo, o redirecionamento falha.

    
por psusi 08.01.2011 / 15:17