Eu estava trabalhando no desenvolvimento de minhas habilidades de linha de comando na noite passada e tive um problema em que, quando usei o sudo, recebi uma mensagem de erro dizendo 'permissão negada'. No entanto, quando eu usei 'sudo su' e me tornei root, o comando funcionou.
Por que o sudo não funcionou em primeira instância?
Isso foi:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
Na edição Linux Bible 2010 na seção sobre como configurar um servidor LAMP.
command-line
wdypdx22
fonte
fonte
sudo -s
maissudo su
.Respostas:
Os <,> e >> são usados para o redirecionamento de entrada / saída para comandos - que é um recurso fornecido pelo shell (por exemplo, bash). Portanto, se você digitar um comando como esse
sudo cat > /var/www/info.php
, o shell que recebe isso como entrada tenta abrir o arquivo/var/www/info.php
e fornece esse arquivo como saída padrão para osudo
comando. Osudo
comando nem sabe se sua saída está indo para um console ou redirecionada para um arquivo, porque isso é resolvido pelo shell que o invoca.Se o shell em que você digitou seu comando for o seu shell de login ou outro shell em execução em um terminal com seu ID de usuário, ele terá os mesmos privilégios que o seu ID de usuário - não os do root.
Portanto, no seu caso, enquanto o comando cat é executado como root, a cópia de sua saída
/var/www/info.php
é tentada pelo shell em execução como um usuário normal, o que, como esperado, falha.Uma solução alternativa para essas situações é usar o
tee
comando:Isso terá o efeito pretendido de colocar todo o texto digitado no console até ^ D no arquivo especificado como parâmetro.
Um efeito colateral talvez indesejável é que
tee
também fará eco da saída para o stdout; portanto, depois que você digitar cada linha e pressionar entertee
, imprimirá uma cópia dela de volta. Para evitar isso, você pode usar a seguinte variante.Detalhes sobre
tee
podem ser obtidos através deinfo tee
um terminal.fonte
O sudo não funciona para comandos que precisam de permissões para gravar um arquivo, como:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
Explica na página de manual do sudo.
fonte
sudo
. Conforme observado na resposta de koushik, o comportamento é bastante previsível, consistente e "correto" para o modelo de permissão unix.O problema é que a parte "> foo.txt" é interpretada e executada pelo seu interpretador de comandos (shell) muito antes de o comando sudo estar sendo executado. O comando sudo não tem idéia de que você deseja redirecionar sua saída para um arquivo.
Seu intérprete de comando não possui autoridade root (mas o comando sudo será posteriormente), portanto, não poderá redirecionar a saída para foo.txt.
fonte
Outra maneira de resolver isso é iniciar um subshell com sudo e executar esse comando nesse subshell:
aqui, o comando "has sudo" é bash, e qualquer coisa executada nele tem permissões de root.
$ 2c, * -pike
fonte