Usando sudo su para comandos?

15

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.

wdypdx22
fonte
Se você não der um exemplo, é meio difícil resolver o problema.
LassePoulsen
1
Considere sudo -smais sudo su.
Jeremy L

Respostas:

18

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.phpe fornece esse arquivo como saída padrão para o sudocomando. O sudocomando 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 teecomando:

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 colateral talvez indesejável é que teetambém fará eco da saída para o stdout; portanto, depois que você digitar cada linha e pressionar enter tee, imprimirá uma cópia dela de volta. Para evitar isso, você pode usar a seguinte variante.

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

Detalhes sobre teepodem ser obtidos através de info teeum terminal.

koushik
fonte
2

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.

NightwishFan
fonte
4
Mencionar que você pode "sudo -i" ou "sudo -s" para obter um prompt raiz tornaria essa resposta ainda melhor!
Jorge Castro
Não há canal no comando de exemplo; há um redirecionamento. Além disso, "às vezes não funciona" parece transmitir comportamentos esquisitos sudo. Conforme observado na resposta de koushik, o comportamento é bastante previsível, consistente e "correto" para o modelo de permissão unix.
msw
2

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.

Thorbjørn Ravn Andersen
fonte
1

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

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

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

$ 2c, * -pike

commonpike
fonte