julho 22, 2019

Substituir usuário - o comando "su"

Como muita gente, eu sempre pensei que o comando su significasse super user (super usuário), mas isso foi só pela preguiça de dar uma olhadinha no manual. Na verdade, su vem da própria descrição da finalidade do comando, que é executar algo como um usuário substituto, ou seja, "substituir usuário", sendo o usuário root, o "super usuário", apenas o usuário padrão do comando quando não especificamos nenhum outro.

Pode parecer bobagem, um mero detalhe, mas essa definição muda toda a compreensão de como o comando se comporta. O aspecto mais importante a observar quando usamos o su, é que ele sempre irá alterar varáveis de ambiente, especialmente essas quatro:
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

Para entendermos melhor, observe a saída do comando abaixo:

Estes são os valores armazenados nessas variáveis para o meu usuário. Mas, se executarmos o comando su sem argumentos, o resultado será esse:

Observe que a variável HOME agora contém o caminho da pasta /root, mas USER e LOGNAME não foram alterados. No entanto, é o usuário root que está no cntrole agora, o que pode ser confirmado com o comando whoami...

Outro detalhe aqui, é que a varável HOME mudou, mas o diretório corrente ainda é o meu (/home/gda). Isso pode causar grandes confusões, porque o usuário de fato é o root, mas quase todas as varáveis de ambiente permanecem as mesmas. Se um arquivo for criado neste momento, por exemplo, ele irá pertencer ao root, e não ao usuário que invocou o comando.

Para evitar isso, nós temos a opção de utilizar o comando su com o argumento --login (-l ou -)

Desta forma, todas as variáveis de ambiente mudaram. Observe que até o meu prompt (definido pela variável PS1) mudou de cor, já que não estou mais utilizando as minhas variáveis, e sim as do usuário root.

E o comando "sudo"?

Bom, o sudo, embora tenha uma finalidade bem diferente, a sua compreensão passa pelo mesmo caminho: substitute user and do (substitua o usuário e faça). Mas, o que acontece quando executamos o comando sudo su, como é visto em muitos tutoriais de Linux por aí? O resultado está na imagem abaixo:

Observe que tudo indica que, de fato, é o root que está no controle, todas as quatro varáveis principais foram trocadas, porém... Observe o prompt. Apesar da cerquilha (#) estar presente, ele continua verde, que é a cor definida para a varável PS1 no meu usuário. Isso significa que, fora as que aparecem na imagem, existem outras variáveis de ambiente que permaneceram inalteradas.

Isso é bom ou ruim?

"Não sei se é bom ou ruim, só sei que é assim."
De fato, não se trata de ser bom ou ruim, mas de compreender o que acontece com cada forma de executar um comando. Nas três situações, su, su -l e sudo su, existe o resultado prático de estarmos utilizando os poderes de super usuário do root, o que muda são os detalhes de que devemos estar conscientes.

Por exemplo, os comandos su e sudo su não irão mudar de diretório, permanecendo onde estavam quando foram invocados. Já com o argumento -l, ele irá automaticamente para a pasta /root e, se a gente não estiver ciente disso (ou utilizar esses prompts bonitinhos da moda que quase não informam nada), acidentes podem acontecer.

Nenhum comentário:

Postar um comentário

O sistema de comentários do Blogspot é um lixo e praticamente me obriga a liberar ou moderar todos os comentários. Portanto, eu peço perdão antecipadamente caso o seu comentário demore para aparecer.

Mas não se acanhe por causa disso! :-)