Esta é uma pergunta bastante simples, pelo menos parece que deveria ser, sobre permissões de sudo no Linux.
Muitas vezes, eu só quero acrescentar algo /etc/hosts
ou um arquivo semelhante, mas acabo não sendo possível, porque ambos >
e>>
não são permitidos, mesmo com root.
Existe alguma maneira de fazer isso funcionar sem ter que su
ousudo su
entrar enraizar?
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
fariatee -a
vez detee --append
.-a
--append
bandeira ( ) o comando sobrescreveria o arquivo inteiro com a string especificada, em vez de anexá-lo ao final.O problema é que o shell gera redirecionamento de saída, não sudo ou echo, portanto isso está sendo feito como seu usuário comum.
Tente o seguinte trecho de código:
fonte
sh
, o eco pode interpretar seqüências de escape como\t
dentro de aspas simples. Você poderia usar em seuprintf %s 'something'
lugar.sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
por exemplo.O problema é que é o seu shell que lida com o redirecionamento; está tentando abrir o arquivo com o seu permissões e não as do processo que você está executando no sudo.
Use algo assim, talvez:
fonte
sudo
(por razões de segurança) não propaga o ambiente para o subprocesso. Você pode usarsudo -E
para ignorar essa restrição.sudo sh -c "echo 'something' >> $FILENAME"
, com aspas duplas, este vai funcionar - a substituição de variáveis é feito pela casca exterior, não o shell sudoed.fonte
Fazendo
Deveria trabalhar. O problema é que> e >> são tratados pelo seu shell, não pelo comando "sudoed", portanto as permissões são suas, não as do usuário no qual você está "sudoando".
fonte
Gostaria de observar, para os curiosos, que você também pode citar um heredoc (para blocos grandes):
fonte
"
, mas não causa o comando falhar.)No bash, você pode usar
tee
em combinação com> /dev/null
para manter o stdout limpo.fonte
Usando a resposta de Yoo , coloque isso em seu
~/.bashrc
:Agora você pode correr
sudoe 'deb blah # blah' /etc/apt/sources.list
Editar:
Uma versão mais completa que permite canalizar ou redirecionar a entrada de um arquivo e inclui uma
-a
opção para desativar o anexo (que está ativado por padrão):fonte
Você também pode usar
sponge
omoreutils
pacote e não precisa redirecionar a saída (ou seja, semtee
barulho a ocultar):fonte
Usando sed -i com $ a , você pode acrescentar texto, contendo variáveis e caracteres especiais, após a última linha.
Por exemplo, adicionando $ NEW_HOST com $ NEW_IP em / etc / hosts:
opções sed explicadas:
fonte
eco 'Olá Mundo' | (sudo tee -a /etc/apt/sources.list)
fonte
Que tal:
eco de texto | sudo dd status = none of = privilegedfile
Desejo alterar / proc / sys / net / ipv4 / tcp_rmem.
Eu fiz:
sudo dd status = nenhum dos = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
elimina o eco com um documento de linha única
fonte
Isso funcionou para mim: comando original
Comando de trabalho
fonte
tee -a
. Apenastee
substituirá o arquivo!Você pode alterar a propriedade do arquivo e depois alterá-lo novamente depois de usar
cat >>
para anexar?Algo como este trabalho para você?
fonte