Sim, usando tee . Então, echo test > /tmp/foo torna-se
echo test | sudo tee /tmp/foo
Você também pode acrescentar ( >> )
echo test | sudo tee -a /tmp/foo
Quando você tenta modificar um arquivo sem ter permissões de gravação nele, você recebe um erro:
> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Sudoing não ajuda, porque ele executa o comando como root, mas o shell manipula o redirecionamento de stdout e abre o arquivo da mesma forma que você:
> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Existe uma maneira fácil de redirecionar o stdout para um arquivo que você não tem permissão para gravar, além de abrir um shell como root e manipular o arquivo dessa maneira?
> sudo su
# echo test > /tmp/foo
Para substituir o conteúdo do arquivo pela saída de echo (como o operador de redirecionamento de > ).
echo test | sudo dd of=/tmp/foo
Para gravar no arquivo (no início, embora você possa usar seek para produzir em diferentes deslocamentos) sem truncar (como o operador shell 1<> Bourne):
echo test | sudo dd of=/tmp/foo conv=notrunc
Para anexar ao arquivo (como >> ), com GNU dd :
echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc
Veja também dd do conv=excl do GNU para evitar a supressão de um arquivo existente (como com set -o noclobber em shells POSIX) e conv=nocreat para o oposto (apenas atualize um arquivo existente).
tee é provavelmente a melhor escolha, mas dependendo da sua situação, algo assim pode ser suficiente:
sudo sh -c 'echo test > /tmp/foo'
Embora eu concorde, | sudo tee é o caminho canônico, às vezes sed (assumindo aqui o GNU sed ) pode funcionar:
cat sudotest
line 1
sudo sed -i '1iitest' sudotest && cat sudotest
itest
line 1
sudo sed -i '$aatest' sudotest && cat sudotest
itest
line 1
atest
-i modifica o arquivo no lugar. 1i significa inserir antes da linha 1. $a significa acrescentar após a última linha.
Ou copie para o xclipboard:
somecommand | xclip
sudo gedit sudotest
move cursor to desired place, click middle mouse button to insert, save
Eu tenho chutado as ideias para um problema semelhante e descobri as seguintes soluções:
sudo uncat onde uncat é um programa que lê a entrada padrão e a grava no arquivo chamado na linha de comando, mas ainda não escrevi uncat .
sudocat da variante de sudoedit que ainda não escrevi que limpa sudo cat ou sudo uncat .
ou este pequeno truque de usar sudoedit com um EDITOR que é um script de shell
#!/bin/sh
# uncat
cat > "$1"
que pode ser invocado como |sudo ./uncat file ou | EDITOR=./uncat sudoedit , mas que tem efeitos colaterais interessantes.
Use esponja do pacote moreutils. Tem a vantagem de não gravar no stdout.
echo test | sudo sponge /tmp/foo
Use a opção -a para anexar a um arquivo em vez de substituí-lo.
O erro vem da ordem em que o shell faz as coisas.
O redirecionamento é tratado antes mesmo de o shell executar sudo e, portanto, ser feito com as permissões do usuário com o qual você está trabalhando atualmente. Como você não tem permissões de gravação para criar / truncar o alvo do redirecionamento, você recebe um erro permission denied do shell.
A solução é garantir que o arquivo de saída seja criado com a identidade fornecida por sudo , por exemplo, com tee :
$ generate_output | sudo tee target_file
Tags sudo permissions io shell io-redirection