Usando o sudo su para comandos?

15

Eu estava trabalhando no desenvolvimento de minhas habilidades de linha de comando na noite passada e me deparei com um problema em que quando eu usava o sudo, recebi uma mensagem de erro dizendo 'permissão negada'. No entanto, quando eu usei 'sudo su' e tornou-se root o comando funcionou.

Por que o sudo não funcionou na primeira vez?

Foi:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Da edição Linux Bible 2010 na seção sobre como configurar um servidor LAMP.

    
por wdypdx22 24.09.2010 / 21:16

4 respostas

18

As tags & lt ;, > e > > são usados para redirecionamento de entrada / saída para comandos - que é um recurso fornecido pelo shell (por exemplo, bash). Portanto, se você digitar um comando como sudo cat > /var/www/info.php , o shell que recebe isso como entrada tentará abrir o arquivo /var/www/info.php e fornecerá esse arquivo como a saída padrão para o comando sudo . O comando sudo nem sequer sabe se sua saída está indo para um console ou redirecionada para um arquivo, porque isso é feito pelo shell que o invoca.

Se o shell em que você digitou seu comando for 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 seu ID de usuário - não os de root.

Portanto, no seu caso, enquanto o comando cat é executado como root, a cópia de sua saída para /var/www/info.php é tentada pelo shell sendo executado como um usuário normal, o que, como esperado, falha.

Uma solução alternativa para essas situações é usar o comando tee :

sudo tee /var/www/info.php

Isso terá o efeito pretendido de colocar todo o texto digitado no console até ^ D no arquivo especificado como parâmetro.

Um efeito secundário talvez indesejável é que tee também fará o eco da saída para o stdout, portanto, depois de digitar cada linha e pressione Enter, tee exibirá uma cópia dela. Para evitar isso, você pode usar a seguinte variante.

sudo tee /var/www/info.php > /dev/null

Detalhes sobre tee podem ser obtidos via info tee em um terminal.

    
por koushik 24.09.2010 / 22:04
2

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.

    
por NightwishFan 24.09.2010 / 21:21
2

O problema é que a parte "> foo.txt" é interpretada e executada pelo seu interpretador de comandos (shell) longo antes que o comando sudo esteja sendo executado. O comando sudo não tem idéia de que você deseja redirecionar sua saída para um arquivo.

Seu interpretador de comandos não possui autoridade root (mas o comando sudo eventualmente será mais tarde), portanto não é possível redirecionar a saída para foo.txt.

    
por Thorbjørn Ravn Andersen 25.09.2010 / 16:48
1

Outra maneira de resolver isso é iniciar um subshell com sudo e executar esse comando nesse subnível:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

aqui, o comando que "tem sudo" é bash, e qualquer coisa executada nele tem permissões de root.

$ 2c * -pike

    
por commonpike 26.09.2010 / 14:27