Como executar um comando que envolve redirecionar ou canalizar com o sudo?

54

Estou tentando seguir o que suponho serem as melhores práticas de usar o sudo em vez da conta root.

Estou executando uma operação de arquivo de concat simples, como:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Isso falha no direito do "> >" está sendo executado como o usuário normal. A adição de sumos extras também falha (comportamento esperado desde a canalização para o comando sudo e não para o arquivo).

Exemplo é apenas isso, mas foi verificado e testado na conta raiz.

    
por DarkSheep 26.12.2013 / 13:41

5 respostas

67

Você pode invocar um novo shell como root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Você também pode simplesmente elevar um processo para gravar no arquivo:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
    
por 26.12.2013 / 14:01
18

Outra opção, igualmente segura, é usar a opção sudo do -i para fazer login como root:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Isso ainda segue as regras de práticas recomendadas, pois a conta raiz não está ativada como tal, mas permite que você faça as coisas com segurança. De man sudo :

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 
    
por 26.12.2013 / 14:10
10

Se você expressar seu comando sem aspas simples, poderá colocá-lo entre aspas simples e executá-lo por meio de um shell intermediário.

Para executar isso como root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Escreva o comando de uma maneira diferente que não use ' :

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Em seguida, invoque sudo sh -c … :

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Como alternativa, para gravar a saída em um arquivo que somente o root pode gravar, chame sudo tee . Passe a opção -a para tee para anexar ao arquivo de destino, caso contrário, o arquivo será truncado.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Para modificações de arquivos mais complexas, você pode chamar sudo sed , sudo ed , sudo perl ,…

Alternativamente, use um editor decente e faça-o chamar de sudo. No Emacs, abra /sudo:/etc/conf.d/hwclock . No Vim, chame :w !sudo tee % para gravar no arquivo aberto como root ou use o plug-in sudo.vim . Ou vá do final do sudo e chame sudoedit /etc/conf.d/hwclock .

Ou você pode ceder ao lado sombrio e executar um shell como root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
    
por 27.12.2013 / 01:50
3

sudo dd of=

Para anexar como você deseja:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

ou para recriar o arquivo do zero:

echo inbytes | sudo dd of=outfile

Vantagens:

  • mais agradável que tee , pois não há /dev/null de redirecionamento
  • mais agradável que sh , pois não há subshell
  • dd tem muitas opções poderosas, por ex. status=progress para ver o progresso da transferência

Funciona porque o sudo encaminha o stdin para o comando.

    
por 28.05.2017 / 08:38
2

O comando falha devido às permissões redirecionadas para o arquivo. O redirecionamento acontece mesmo antes do comando sudo ser chamado.

Você terá que ter certeza de que é o root que realmente abre o arquivo para gravação.

A maneira mais simples de fazer isso:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

O echo pode ser executado como usuário comum, pois apenas produz uma cadeia de texto. O utilitário tee terá que ser executado como root, e tee -a anexará os dados. Nós redirecionamos a saída para /dev/null porque tee , por padrão, duplicará seus dados de entrada para sua saída padrão, além de gravar nos arquivos indicados.

Com bash ou qualquer shell que entenda "here-strings":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Isto é idêntico em efeito ao acima. Apenas a maneira como produzimos a string é alterada.

Outro modo ligeiramente indireto de fazer isso:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Aqui, o redirecionamento acontece dentro de um shell filho sh -c sendo executado como root.

    
por 22.02.2018 / 10:53