Por que “sudo -u root echo` whoami` ”não retorna raiz?


11

Como você usa o sudo para executar um comando como o usuário root real no Ubuntu? Originalmente, pensei que esse era o comportamento padrão do sudo, até que executei:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

No entanto, este é o tipo de comportamento que eu quero, mas apenas em uma única linha:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root

11
por que eco whoami? Basta dizer sudo whoami .. retornos raiz
Neo

Respostas:


26

Na verdade, eles são executados como raiz. Mas o que está acontecendo com você é que os ticks anteriores estão sendo avaliados antes das sudo execuções, pois são necessários para avaliar o comando. Mais diretamente, por que não apenas isso:

sudo whoami

Seus whoamitiques in-back são realmente avaliados em uma subcasca como o usuário atual, e é por isso que você vê o que faz.


2
Isto está errado. O sudo roda com privilégios de root, mas não como root.
Manfred Moser

@ Moser, então por que seu comando imprime "root"?
Cerin 31/01

4
@ManfredMoser: É executado com o UID de 0(zero), que é exatamente o que as pessoas chamam de "root". (Você teria sido bem se sudoapenas estendeu suas capacidades sem alterar o UID Mas não é isso que ele faz..)
user1686

1
M. Moser poderia estar fazendo questão de mudar o ID do usuário efetivo do processo, exigindo que o próprio processo altere o ID do usuário real, como de fato sudofaz. Mas, ao ler a resposta xyr, isso não parece ter sido realmente o caso.
JdeBP

7

O subshell ( whoami) é executado primeiro, como você, e o resultado ( myuser) é colocado no sudocomando; o que sudovê é echo myuser. Pense nisso como um atalho para:

tmpvar=`whoami`
sudo echo "$tmpvar"

1

Parece haver alguma suposição acontecendo aqui ...

Os backticks obviamente estão fazendo o que os outros explicaram, expandindo-se whoamiantes de invocar 'sudo' e deixando os backticks fora de 'root', como esperado.

Mas é útil entender o que realmente está acontecendo com o sudo (8). Então, na verdade, olhei para a página de manual!

"O uid e o gid reais e efetivos estão definidos para corresponder aos do usuário de destino ..."

Portanto, parece que o comportamento observado não tem nada a ver com a diferença entre o ID do usuário efetivo e o real.

Também é ilustrativo fazer "sudo printenv" e comparar com apenas "printenv", o que realmente me surpreendeu um pouco. Mostra que [i] algumas [/ i] variáveis ​​exportadas estão disponíveis e outras não: relata HOME, PATH, PS1, SHELL, TERM e EDITOR do usuário que está chamando, mas não outras como MANPATH, CVSROOT, LD_LIBRARY_PATH ou ENV. Isso parece um pouco estranho, pois pode fazer com que os programas se comportem de maneira diferente do que no usuário original ou como root.


0

O sudo permite executar qualquer comando com privilégios de root, mas não como usuário root. A razão pela qual isso é útil é que, com essa configuração, várias pessoas podem ter direitos de root, mas todo o log e assim por diante ainda indicam quem fez as alterações.

Essa configuração é melhor do que compartilhar senhas raiz. Como tal, foi substituído por ter usuários root em muitas distribuições, incluindo o Ubuntu.

sudo su, por outro lado, faz de você o usuário root e, portanto, não deve ser realmente usado.

Essa diferença também explica seu comportamento observado (correto).


6
Não. O que explica o comportamento é uma questão muito simples de como a substituição de comandos no shell funciona. Não tem nada a ver com privilégios.
JdeBP

-2

O Sudo concede temporariamente quem você é (desde que você tenha permissão para sudo) privilégios de nível raiz.

Para ser root, você precisa fazer login como root, que está bloqueado no Ubuntu por padrão.

Você precisa ter cuidado com isso, o sudo não é root. Se você quiser mostrar que Fred está executando algo como sudo, como as variáveis ​​de ambiente SUDO, SUDO_COMMAND pode ser a mais útil.


Raiz está bloqueada no Ubuntu? Você tem certeza sobre isso? Eu sei que é desencorajado, mas achei que eles apenas tornaram um pouco mais difícil para um iniciante, definindo uma senha obscura usando um UUID, que pode ser alterado usando os métodos usuais.
Marty Fried
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.