Recebi acesso ao sudo em uma de nossas caixas Linux RedHat de desenvolvimento e parece que muitas vezes preciso redirecionar a saída para um local ao qual normalmente não tenho acesso de gravação.
O problema é que este exemplo artificial não funciona:
sudo ls -hal /root/ > /root/test.out
Acabei de receber a resposta:
-bash: /root/test.out: Permission denied
Como posso fazer isso funcionar?
linux
permissions
sudo
io-redirection
permission-denied
Jonathan
fonte
fonte
root
(nesse caso, continue lendo as respostas), mas com muita frequência, basta criar o arquivo em outro lugar, como você.Respostas:
Seu comando não funciona porque o redirecionamento é realizado pelo seu shell, que não tem permissão para gravar
/root/test.out
. O redirecionamento da saída não é realizado pelo sudo.Existem várias soluções:
Execute um shell com o sudo e forneça o comando usando a
-c
opção:Crie um script com seus comandos e execute esse script com sudo:
Corra
sudo ls.sh
. Veja a resposta de Steve Bennett se você não quiser criar um arquivo temporário.Inicie um shell
sudo -s
e execute seus comandos:Use
sudo tee
(se você precisar escapar muito ao usar a-c
opção):O redirecionamento para
/dev/null
é necessário para impedir a saída do tee para a tela. Para acrescentar em vez de sobrescrever o arquivo de saída (>>
), usetee -a
outee --append
(o último é específico para os coreutils do GNU ).Agradecemos a Jd , Adam J. Forster e Johnathan pela segunda, terceira e quarta soluções.
fonte
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Alguém aqui acabou de sugerir sudoing tee:
Isso também pode ser usado para redirecionar qualquer comando para um diretório ao qual você não tem acesso. Ele funciona porque o programa tee é efetivamente um programa de "eco para um arquivo" e o redirecionamento para / dev / null é para impedir que ele também seja exibido na tela para mantê-lo igual ao exemplo original inventado acima.
fonte
sudo
(ou seja, para o próprio comando) pode ser omitidoUm truque que eu descobri foi
fonte
sudo dd
é melhor que ossudo tee /root/file > /dev/null
exemplos acima!dd
é o nome do comando,of=/root/test.out
é o argumento que informa odd
que são os arquivos de saída.of
significa arquivo de saída edd
é uma ferramenta muito popular usada no Linux e no OSX (principalmente para gravar imagens em discos). Este é um truque interessante, com certeza.dd
é provavelmente igualmente útil comotee
aqui. Nos dois casos, você está usando um comando comum e conhecido para uma finalidade que, embora ligeiramente diferente da finalidade original pretendida, ainda é bem conhecida e documentada. Emboradd
seja bom em copiar grandes quantidades de dados, não é ruim com pequenas quantidades. Aqui tem o benefício de não fazer eco da saída para a saída padrão.sudo dd
próximas umas das outras, deseja ter muita, muita certeza de que os argumentos a seguir estão corretos (especialmente considerando sua sintaxe não padrão). Eles não chamam de "destruidor de disco" por nada ...O problema é que o comando é executado sob
sudo
, mas o redirecionamento é executado sob o seu usuário. Isso é feito pelo shell e há muito pouco que você pode fazer sobre isso.As formas usuais de contornar isso são:
Envolva os comandos em um script que você chama sob sudo.
Se os comandos e / ou o arquivo de log forem alterados, você poderá fazer com que o script os aceite como argumentos. Por exemplo:
Chame um shell e passe a linha de comando como um parâmetro com
-c
Isso é especialmente útil para comandos compostos únicos. Por exemplo:
fonte
Ainda outra variação sobre o tema:
Ou claro:
Eles têm a (pequena) vantagem de que você não precisa se lembrar de quaisquer argumentos para
sudo
oush
/bash
fonte
Esclarecendo um pouco sobre por que a opção tee é preferível
Supondo que você tenha permissão apropriada para executar o comando que cria a saída, se você canalizar a saída do seu comando para tee, você só precisará elevar os privilégios do tee com sudo e direcionar o tee para gravar (ou anexar) no arquivo em questão.
no exemplo dado na pergunta, isso significaria:
para mais alguns exemplos práticos:
Em cada um desses exemplos, você está pegando a saída de um comando não privilegiado e gravando em um arquivo que geralmente é gravável apenas pela raiz, que é a origem da sua pergunta.
É uma boa idéia fazê-lo dessa maneira, porque o comando que gera a saída não é executado com privilégios elevados. Parece que não importa aqui,
echo
mas quando o comando source é um script no qual você não confia completamente, é crucial.Observe que você pode usar a opção -a para adicionar anexar (como
>>
) ao arquivo de destino em vez de substituí-lo (como>
).fonte
Faça o sudo executar um shell, assim:
fonte
A maneira como eu abordaria esse problema é:
Se você precisar gravar / substituir o arquivo:
Se você precisar anexar ao arquivo:
fonte
Que tal escrever um script?
Nome do arquivo: myscript
Em seguida, use sudo para executar o script:
fonte
Sempre que tenho que fazer algo assim, eu me torno raiz:
Provavelmente não é o melhor caminho, mas funciona.
fonte
Eu faria assim:
fonte
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Não pretenda vencer um cavalo morto, mas há muitas respostas aqui
tee
, o que significa que você precisa redirecionarstdout
para a/dev/null
menos que queira ver uma cópia na tela.Uma solução mais simples é usar apenas
cat
assim:Observe como o redirecionamento é colocado entre aspas para que ele seja avaliado por um shell iniciado em
sudo
vez daquele que o executa.fonte
sudo bash -c "ls -hal /root > /root/test.out"
. Usar tee evita a necessidade de uma concha, enquanto o gato não.Isso é baseado na resposta que envolve
tee
. Para facilitar as coisas, escrevi um pequeno script (eu o chamosuwrite
) e o coloco/usr/local/bin/
com+x
permissão:Conforme mostrado em USAGE no código, tudo o que você precisa fazer é canalizar a saída para esse script, seguido pelo nome de arquivo acessível ao superusuário desejado e solicitará sua senha automaticamente, se necessário (uma vez que inclui
sudo
).Observe que, como esse é um invólucro simples
tee
, ele também aceitará a-a
opção do tee de acrescentar e também suporta a gravação em vários arquivos ao mesmo tempo.Ele também possui alguma proteção simplista contra a gravação em
/dev/
dispositivos, o que foi uma preocupação mencionada em um dos comentários nesta página.fonte
Talvez você tenha acesso ao sudo apenas a alguns programas / caminhos? Então não há como fazer o que você quer. (a menos que você o corte de alguma forma)
Se não for o caso, talvez você possa escrever o script bash:
Pressione ctrl+ d:
Espero que ajude.
fonte
fonte
sudo
qualquer maneira,at
não é útil ou necessário.sudo sh -c 'echo test >/tmp/test.out'
faz o mesmo de maneira muito mais eficiente e elegante (mas ainda sofre com a falha de que você provavelmente está executando coisas como asroot
quais não precisam desse privilégio; você geralmente deve evitar comandos privilegiados quando puder).