Pourquoi utilisons-nous su - et pas seulement su?

179

Je ne comprends pas pourquoi il su -est préférable de suse connecter en tant que root.

Dharmit
la source

Réponses:

242

su -appelle un shell de connexion après le changement d'utilisateur. Un shell de connexion réinitialise la plupart des variables d'environnement, fournissant une base propre.

su change simplement d’utilisateur, fournissant à un shell normal un environnement presque identique à celui de l’ancien utilisateur.

Imaginez, vous êtes un développeur de logiciels avec un accès utilisateur normal à une machine et votre administrateur ignorant ne vous donnera tout simplement pas un accès root. Faisons-le (espérons-le) duper.

$ 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"

Maintenant, vous demandez à votre administrateur pourquoi vous ne pouvez pas catinsérer le fichier factice dans votre dossier personnel, cela ne fonctionnera tout simplement pas!

$ 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!

Si votre administrateur n'est pas si malin ou s'il est un peu paresseux, il pourrait venir à votre bureau et essayer avec ses pouvoirs de super-utilisateur:

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

Hou la la! Merci, super administrateur!

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

Il, il.

Vous avez peut-être remarqué que la $PATHvariable corrompue n'a pas été réinitialisée. Cela ne serait pas arrivé si l'administrateur avait appelé à la su -place.

remuer
la source
10
su --est le même que su.
Mikel
12
- est un drapeau que la plupart des programmes interprètent comme "rien après cela ne doit être considéré comme un drapeau". Utile pour les choses qui commencent par un tiret.
David Mackintosh
2
N'oubliez pas de définir la valeur umask000, sinon cela ne fonctionnera pas.
Lekensteyn
10
On pourrait aussi bien mettre un sufichier dans le PATH. Ce n'est pas si difficile d'imiter le comportement du réel su. Le super-utilisateur a quand même été négligent :-)
Stéphane Gimenez le
10
su --n'est PAS identique à su -: --indique à un gestionnaire d'options getopt (s) (ou similaire) d'arrêter le traitement de la ligne de commande pour d'autres options (utile par exemple si le reste contient des noms de fichiers pouvant commencer par un '-'). C'est-à-dire que, dans "rm -i - -f": -f est alors traité comme un argument normal, donc ici comme le nom du fichier dans rm -i, et non comme une -foption supplémentaire à la rmcommande. C'est su --juste suet pas su -! Donc, su --serait aussi dangereux pour l'exemple (amusant et instructif) givan by wag. Utilisez su -.
Olivier Dulac
36

su -vous connecte complètement en tant que root, alors suque vous prétendez être root.

L'exemple le plus évident en est qu'il ~s'agit du répertoire de base de la racine si vous utilisez su -, mais de votre propre répertoire de base si vous utilisez su.

Selon votre système, cela peut également signifier des différences dans les PATHfichiers d’ invite , ou d’historique.

Donc, si vous faites partie d'une équipe administrant un système et que votre collègue vous donne une commande à exécuter, vous savez qu'il fonctionnera de la même manière si vous utilisez tous les deux su -, mais si vous utilisez tous les deux su, il peut y avoir des différences en raison de votre différentes configurations de shell.

D'autre part, si vous voulez exécuter une commande en tant que root mais en utilisant votre propre configuration, alors peut su- être que c'est mieux pour vous.

De plus , ne pas oublier sudo, qui a une -soption pour démarrer une course shell en tant que root. Bien entendu, ces règles sont également différentes et changent en fonction de la distribution que vous utilisez.

Mikel
la source
1
Quand je "su", je reçois ~ et $ HOME, tous deux évaluant vers / root. Le comportement que vous décrivez est-il spécifique à certains shells, à certaines versions de système d'exploitation ou à quelque chose? Je crois comprendre que ~ peut être étendu par le noyau. J'ai zsh comme shell (et celui de la racine).
JasonWoof
Vos .bashrcou /etc/bashrcou /etc/profile.dscripts sont en train de se mettre PATH. Rechercher if [ $UID -eq 0 ]ou quelque chose comme ça.
Mikel
$USERpar exemple est laissé inchangé.
Peter
1
Qu'en est- il sudo su?
Simon Kuang
1
Votre exemple ne fonctionne pas pour moi. Le même répertoire est résolu de l'une ou l'autre manière.
Daniel W.
1

J'utilise su - quand je suis dans un répertoire en tant qu'utilisateur ordinaire mais que je veux passer à la racine et rester dans le même répertoire après le changement. Lorsque vous utilisez su - il passe l'utilisateur à la racine et vous emmène également à / root qui est le répertoire de base.

Digue de calvin
la source
1
Ou /tout ce qui est défini comme le répertoire personnel de la racine
Jeff Schaller
1

La principale différence est:

su - username configure l'environnement shell comme s'il s'agissait d'une connexion propre en tant qu'utilisateur spécifié; il accède et utilise les variables d'environnement des utilisateurs spécifiés,

su username démarre simplement un shell avec les paramètres d’environnement actuels pour l’utilisateur spécifié.

Si le nom d'utilisateur n'est pas spécifié avec suet su -, le compte root est impliqué par défaut.

Akhil MK
la source