Estou tentando seguir o que presumo serem as melhores práticas de uso do sudo em vez da conta raiz.
Estou executando uma operação simples de arquivo concat, como:
sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Isso falha à direita do ">>" que está sendo executado como usuário normal. A adição de sudos extras também falha (comportamento esperado desde a canalização para o comando sudo e não para o arquivo).
O exemplo é exatamente isso, mas foi verificado e testado na conta raiz.
shell
sudo
io-redirection
quoting
DarkSheep
fonte
fonte
tee
comandos são executados como raiz, não o comando principal, que pode ser complexo e propenso a comportamentos inadequados. (não é o caso deecho
)Outra opção, igualmente segura, é usar
sudo
o-i
switch para fazer login como root:Isso ainda segue as regras de boas práticas, pois a conta raiz não está realmente ativada como tal, mas permite que você faça as coisas como raiz com segurança. De
man sudo
:fonte
sudo bash
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:
Escreva o comando de uma maneira diferente que não use
'
:Em seguida, invoque
sudo sh -c …
:Como alternativa, para gravar a saída em um arquivo no qual somente o root pode gravar, chame
sudo tee
. Passe a-a
opção paratee
anexar ao arquivo de destino, caso contrário, o arquivo será truncado.Para mais modificações de arquivo complexos, você pode chamar
sudo sed
,sudo ed
,sudo perl
, ...Como alternativa, use um editor decente e faça com que ele chame 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 liguesudoedit /etc/conf.d/hwclock
.Ou você pode ceder ao lado sombrio e executar um shell como raiz.
fonte
O comando falha devido às permissões no arquivo redirecionado para. O redirecionamento acontece antes mesmo de o
sudo
comando ser chamado.Você precisará se certificar de que é a raiz que realmente abre o arquivo para gravação.
A maneira mais simples de fazer isso:
O
echo
pode ser executado como você usuário comum, uma vez que apenas produz uma cadeia de texto. Otee
utilitário terá que ser executado como root etee -a
anexará dados. Nós redirecionamos a saída para ,/dev/null
porquetee
, por padrão, duplicará seus dados de entrada na saída padrão, além de gravar nos arquivos indicados.Com
bash
ou qualquer shell que entenda "here-strings":Isso é idêntico em efeito ao acima. Somente a maneira como produzimos a string é alterada.
Outra maneira levemente indireta de fazer isso:
Aqui, o redirecionamento acontece dentro de um
sh -c
shell filho executando como root.fonte
sudo dd of=
Para adicionar como quiser:
ou para recriar o arquivo do zero:
Vantagens:
tee
desde nenhum/dev/null
redirecionamentosh
desde nenhum subshelldd
possui muitas opções poderosas, por exemplo,status=progress
para ver o progresso da transferênciaFunciona porque o sudo encaminha o stdin para o comando.
fonte