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

10

Como você usa o sudo para executar um comando como o usuário root no Ubuntu? Eu originalmente pensei que este era o comportamento padrão do sudo, até que eu corri:

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

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

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

myuser@localhost:~$ sudo su -
root@localhost:~# echo 'whoami'
root
    
por Cerin 31.01.2012 / 23:21

5 respostas

26

Na verdade, faz executá-los como root. Mas, o que está acontecendo com você é que os back ticks estão sendo avaliados antes sudo , pois são necessários para avaliar o comando. Mais diretamente, por que não apenas isso:

sudo whoami

Seu whoami em carrapatos atrasados é realmente avaliado em um subshell como o usuário atual, e é por isso que você vê o que faz.

    
por 31.01.2012 / 23:25
7

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

tmpvar='whoami'
sudo echo "$tmpvar"
    
por 31.01.2012 / 23:27
1

Parece haver alguma suspeita acontecendo aqui ...

Os backticks estão obviamente fazendo o que os outros explicaram, expandindo whoami antes de invocar 'sudo', e deixando os backticks desligados 'root', como esperado.

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

"O uid e o gid reais e eficazes são definidos para corresponder aos do usuário alvo ..."

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

Também é ilustrativo fazer "sudo printenv" e comparar com "printenv", o que realmente me surpreendeu um pouco. Ele mostra que [i] algumas variáveis exportadas estão disponíveis e outras não: reporta o HOME, PATH, PS1, SHELL, TERM e EDITOR do usuário, 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 usuário original ou raiz.

    
por 04.02.2012 / 07:15
0

sudo permite que você execute 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 logging e assim por diante ainda indicam quem fez as alterações.

Esta configuração é melhor do que compartilhar senhas raiz. Como tal, substituiu os usuários root em muitas distribuições, incluindo o Ubuntu.

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

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

    
por 31.01.2012 / 23:43
-2

Sudo concede temporariamente quem você é (dado que você tem permissão para sudo em primeiro lugar) privilégios de nível de raiz.

Para ser root, você deve fazer login como root, que é bloqueado no Ubuntu por padrão.

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

    
por 31.01.2012 / 23:27