Vamos por partes...
O utilitário 'su'
O nome su
vem de substitute user e significa "substituir (ou "trocar") usuário". Portanto, como o nome sugere, sua finalidade é trocar o usuário que está logado no shell, seja para iniciar uma nova sessão como este outro usuário, seja para apenas executar comandos. Na prática, nós utilizamos o su
como a solução preferencial para que usuários sem privilégios para a execução de certas tarefas possam executá-las temporariamente com as credenciais de outro usuário. O caso mais comum é o uso das credenciais do usuário root, mas nem sempre este é o caso.
O ponto mais importante a ser observado quando utilizamos o su
, é o fato de que ele fará a alteração de algumas variáveis de ambiente e do caminho atual de acordo com os argumentos que passarmos para ele. As principais variáveis são:
HOME - Caminho da pasta do usuário
SHELL - Shell utilizado pelo usuário
USER - Nome do usuário
LOGNAME - Nome do usuário que fez o login
UID - Número de identificação do usuário
GROUPS - Número de identificação dos grupos do usuário
Dessa lista, USER
e LOGNAME
têm relação direta com o usuário logado pelo seu nome, e UID
(ou EUID
) estão mais próximas do conceito de privilégio de execução.
Sem nenhum argumento (apenas su
), essas variáveis ficarão assim:
HOME - Caminho da pasta home do 'root'
SHELL - Shell definido para o usuário 'root'
UID - Número de identificação do usuário 'root' (0)
GROUPS - Número de identificação dos grupos do usuário 'root' (0)
Mas estas variáveis não serão alteradas:
USER - Nome do usuário não é alterado
LOGNAME - Nome do usuário que fez o login não é alterado
O diretório de trabalho atual também não será alterado!
O comando 'su - '
Um dos argumentos possíveis do utilitário su
é a opção --login
(-l
ou simplesmente um traço -
), que inicia a nova sessão do shell como se, de fato, o usuário root tivesse feito um login. Neste caso, as variáveis que estamos observando são alteradas para:
HOME - Caminho da pasta home do 'root'
SHELL - Shell definido para o usuário 'root'
UID - Número de identificação do usuário 'root' (0)
GROUPS - Número de identificação dos grupos do usuário 'root' (0)
USER - Nome do usuário passa a ser 'root'
LOGNAME - Nome do usuário que fez o login é 'root'
Além disso, o diretório corrente passa a ser a home do root!
Ou seja, com o -l
(ou o traço -
), nós temos praticamente um shell de login real iniciado pelo usuário root.
O que pode ser feito com 'su' e 'su -'?
Isso depende das configurações do sistema operacional. Muitos ainda são configurados para exigir apenas o UID
(ou EUID
) para a realização de tarefas administrativas, enquanto outros exigem o shell de login do root (como é o caso do Debian).
E o 'sudo'?
O utilitário sudo
se parece com o su
, mas tem diferenças importantes:
- A variável
UID
(e EUID
) é mudada para 0
, mas todas as demais variáveis que estamos acompanhando continuam com seus valores originais (do usuário).
- O
sudo
pede a senha do usuário, enquanto o su
pede a senha do root.
- A senha do usuário pode não ser solicitada em subsequentes chamadas do utilitário
sudo
na mesma sessão do shell, o que nunca acontece com o su
.
A principal diferença, porém, é que o sudo
(que significa switch user and do - "troque de usuário e faça") é chamado para que um determinado comando seja executado com privilégios administrativos, enquanto o su
inicia uma outra sessão do shell com os privilégios de outro usuário.
Sobre o comando 'sudo su'
Acho que agora é fácil deduzir que, quando executamos sudo su
, o que estamos de fato fazendo é executar o su
com os privilégios administrativos do root, mas com a senha do nosso usuário. O resultado é equivalente ao comando su -
, com a diferença de que não será iniciado um shell de login, o que podemos comprovar com os exemplos abaixo:
:~$ su -
Senha:
:~# echo $0
-bash
:~# exit
:~$ sudo su
Senha:
:/home/gda# echo $0
bash
O traço (-
) antes do nome do shell (bash
) indica que estamos em um shell de login. Repare também que, com sudo su
, não houve a troca do diretório de trabalho corrente, mas, como a minha pasta pessoal não é a pasta pessoal do root, ela não foi abreviada pelo til (~
).
Conclusão
Espero que tenha ficado mais clara a diferença. Para mais informações e opções, consulte:
:~$ man su
E...
:~$ man sudo