Ao usar o sudo para permitir edições em arquivos, recebo regularmente 'permissão negada'.
Por exemplo, meu mouse está nervoso e lento, então eu quero desativar a pesquisa:
sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf
Sou solicitada uma senha e, em seguida, obtenho:
bash: /etc/modprobe.d/local.conf: Permission denied
Então, tentei fazer uma alteração temporária para desativar a pesquisa usando:
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
Mais uma vez, o sistema respondeu com:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
Alguma ideia?
command-line
bash
sudo
Jack
fonte
fonte
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
como sudo, a menos que faça algo comosudo bash -c 'echo …'
; no entanto, os sistemas POSIX geralmente fornecem umecho
comando externo , como/bin/echo
no OS X, que o sudo pode executar sem o rigamarole. Portanto, oecho
comando que você normalmente executa e oecho
comando com sudo são provavelmente dois comandos diferentes, mas semelhantes.O redirecionamento de saída é feito pelo shell a partir do qual o comando foi chamado . Então, dividindo tudo em bits, aqui está o que está acontecendo *:
shell chama
sudo echo "options drm_kms_helper poll=N"
, que executasudo
comando comecho "options drm_kms_helper poll=N"
linha de comandosudo pede uma senha, abre o shell do superusuário e chama
echo "options drm_kms_helper poll=N"
, que executa oecho
comando passando-o"options drm_kms_helper poll=N"
echo, executando com
root
privilégios, imprime a string na saída padrão.echo
O comando termina, o shell do superusuário sai,sudo
terminao shell do qual o comando foi chamado coleta a saída e tenta redirecioná-la para
/etc/modprobe.d/local.conf
, que é gravável apenas pela raiz. Ele recebe o erro "permissão negada".Para formas de corrigir isso, consulte a resposta @shantanu.
(*) - enquanto a sequência acima ajuda a entender por que o comando falha, na realidade as coisas acontecem um pouco fora de ordem: o shell original percebe o redirecionamento e tenta abrir o arquivo para gravação antes de chamar o
sudo ...
comando. Ao abrir o arquivo falha, o shell nem chama o comando que deveria escrever no arquivo (obrigado a @PanosRontogiannis por apontar isso).Aqui está um teste rápido:
No teste acima,
whoami | tee who.txt
criaríamos um arquivo chamadowho.txt
contendo a palavra "raiz". No entanto, quando o redirecionamento de saída falha no shell de chamada, o arquivo "who.txt" também está ausente porque o comando não foi chamado.fonte
Adicionando à resposta de Shantanu:
... Ou você pode usar um
tee
comando como este:ou se for a saída de um comando:
fonte
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
se você não quiser imprimirstdout
também.Uma abordagem que não vi mencionada aqui é simplesmente executar toda a linha de comando em seu próprio shell. A
sudo
própria página de manual fornece um exemplo dessa abordagem:fonte
Outra opção é usar um arquivo temporário. Isso é útil em um script bash.
fonte
sudo dd of=
Para adicionar como quiser:
ou para recriar o arquivo do zero:
Vantagens:
tee
desde nenhum/dev/null
redirecionamentosh
que nenhuma sub-camada explícita (mas implícita para o redirecionamento)dd
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
dd
em como substituímos nossos sistemas de arquivos outrora ótimos, e não percebemos que isso também é para tarefas mundanas - e que outros comandos como root também causam grandes danos se usados em arquivos / dispositivos errados. Comosudo tee
,sudo dd
é claro, também funcionará com as strings here , por exemplosudo dd of=outfile <<<'hello world'
,. [Obrigado pela edição. NB comsh -c 'cmd'
,sh
é um subprocesso que é uma concha, mas não realmente um subshell exceto no sentido de todos os comandos externos começam como um].