1 voto positivo 0 votos negativos
8,9K visitas
em GNU/Linux por monitor (11,3K pontos)

Bom dia a todos!

Atualmente, quando vou fazer uma instalação no Debian eu tenho que "aumentar" os meus privilégios. Então, executo um dos três (03) comandos abaixo:

computador@computador:~$ sudo su
computador@computador:~$ su
computador@computador:~$ su -

Depois, digito a senha e fico com aquele jogo da velha (#) no final da linha do terminal. Então, consigo fazer todas as instalações que preciso.

Porém, gostaria de saber se existem diferenças entre esses comandos?

Debian 10.7.0 (Stable)

Desde já agradeço a atenção

1 Resposta

2 votos positivos 0 votos negativos
por monitor (15,8K pontos)
selecionada por
 
Melhor resposta

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
por monitor (11,3K pontos)
0 0
Muito obrigado pela explicação Blau! :D
Seja bem-vindo(a) à comunidade debxp, onde você pode fazer perguntas e receber respostas de outros membros.
Atenção pessoal, esta plataforma não é um fórum, embora se pareça muito com um. Neste tipo de ferramenta, o objetivo é fazer e responder perguntas que possam resultar em material de consulta para outras pessoas que tenham as mesmas dúvidas e dificuldades. Portanto, não há sentido em utilizarmos o Ask para socialização, para emitir opiniões pessoais ou para perguntas do tipo "quem usa isso ou aquilo". Espero que compreendam o nosso propósito. :-)
...