'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - Quand importe-t-il de l'utilisation ou pas du tout?

254

Lorsque je fais quelque chose qui nécessite que root soit tapé des dizaines de fois de suite, je préfère basculer ma session sur une session root. Dans les différents tutoriels et des instructions que je l' ai utilisé sur Internet, je vois sudo su, sudo su -, sudo -iet sudo /bin/bashutilisé pour ouvrir une session racine, mais je ne suis pas clair sur la différence entre ceux - ci et quand ou si cette question de différence.

Quelqu'un peut-il éclaircir cela pour moi?

Paul
la source
11
Vous avez oublié de poser des questions sur sudo -set sudo su.
Radu Rădeanu
3
@ RaduRădeanu Quand j'ai tapé la question dans j'ai revu les questions suggérées et aucune de celles-ci n'a vraiment répondu à ma question complète. La même chose est vraie pour les questions que vous avez liées. Bien qu’elles contiennent beaucoup d’informations nouvelles pour moi et je vous remercie d’avoir fait un lien vers celles-ci, je les ai trouvées moins complètes que la réponse fournie ci-dessous par le chaos des utilisateurs, ce qui est beaucoup plus conforme à ce que je recherchais.
Paul

Réponses:

325

Pour expliquer cela, vous devez savoir ce que font les programmes:

  • su- La commande suest utilisée pour passer à un autre utilisateur ( s witch u ser), mais vous pouvez également passer à l'utilisateur root en appelant la commande sans paramètre. suvous demande le mot de passe de l'utilisateur à changer, après avoir tapé le mot de passe que vous avez changé dans l'environnement de l'utilisateur.
  • sudo- sudoest destiné à exécuter une seule commande avec les privilèges root. Mais contrairement à sucela, il vous demande le mot de passe de l'utilisateur actuel. Cet utilisateur doit figurer dans le fichier sudoers (ou un groupe figurant dans le fichier sudoers). Par défaut, Ubuntu "se souvient" de votre mot de passe pendant 15 minutes, vous évitant ainsi de le saisir à chaque fois.
  • bash- Une interface texte pour interagir avec l'ordinateur. Il est important de comprendre la différence entre les shells de connexion, non connectés, interactifs et non interactifs:

Types de coquilles:

  • shell de connexion : Un shell de connexion vous connecte au système en tant qu'utilisateur spécifié. Un nom d'utilisateur et un mot de passe sont nécessaires pour cela. Lorsque vous appuyez sur ctrl+ alt+ F1pour vous connecter à un terminal virtuel, vous obtenez, après une connexion réussie, un shell de connexion.
  • shell autre que de connexion : Un shell exécuté sans connexion est nécessaire pour cela, il s'agit d'un utilisateur actuellement connecté. Lorsque vous ouvrez un terminal graphique dans gnome, c'est un shell sans connexion.
  • shell interactif : Un shell (connecté ou non connecté) dans lequel vous pouvez taper ou interrompre des commandes de manière interactive. Par exemple un terminal gnome.
  • shell non interactif : Un (sous) shell probablement exécuté à partir d'un processus automatisé. Vous ne verrez ni entrée ni sortie.

Les cas sont donc:

  • sudo suAppels sudoavec la commande su. Bash est appelé shell interactif sans connexion. Donc, bash ne fait qu'exécuter .bashrc. Vous pouvez voir qu'après le passage à la racine, vous êtes toujours dans le même répertoire:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -Cette fois, c'est un shell de connexion, donc /etc/profile, .profileet .bashrcsont exécutés et vous vous retrouverez dans le répertoire de base de root avec son environnement.

  • sudo -iC'est presque la même chose que l' sudo su -option -i (simuler la connexion initiale) exécute le shell spécifié par l'entrée de la base de données de mots de passe de l'utilisateur cible en tant que shell de connexion. Cela signifie que les fichiers de ressources spécifiques à la connexion, tels que .profile, .bashrcou .loginseront lus et exécutés par le shell.

  • sudo /bin/bashCela signifie que vous appelez sudoavec la commande /bin/bash. /bin/bashest lancé en tant que shell sans connexion, de sorte que tous les fichiers de points ne sont pas exécutés, mais bash lit lui-même .bashrcl'utilisateur appelant. Votre environnement reste le même. Votre maison ne sera pas la maison de root. Donc, vous êtes root, mais dans l'environnement de l'utilisateur appelant.

  • sudo -slit la $SHELLvariable et exécute le contenu. Si $SHELLcontient /bin/bashil appelle sudo /bin/bash(voir ci-dessus).

Vérifier:

Pour vérifier si vous êtes dans un shell de connexion ou non (ne fonctionne que dans bash car shoptest une commande intégrée):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
le chaos
la source
18
Juste une précision: sudopermet à un utilisateur autorisé d'exécuter une commande en tant que superutilisateur ou autre utilisateur . Quoi qu'il en soit, +1 pour vos efforts.
Radu Rădeanu
2
@chaos Merci pour cette excellente réponse! Cela répond principalement à mes questions, alors je suis allé de l'avant et j'ai noté la réponse à la question, mais je ne comprends pas quand il est souhaitable de lancer un shell particulier. En réalité, je n'utilise Ubuntu que par ligne de commande et je trouve que mon utilisation la plus courante pour ouvrir une rootsession utilisateur (et non pour utiliser sudo) est lorsque je fais quelque chose qui nécessite une utilisation intensive de rootprivilèges, par exemple pour installer quelque chose de nouveau ou effectuer une reconfiguration majeure. . Je l'utilise sudo /bin/bash, mais apparemment, cette méthode a une mauvaise réputation pour une raison que je ne comprends pas.
Paul
2
En outre, il est plus "correct" de dire que su est synonyme d'utilisateur de changement plutôt que de super utilisateur. C'est-à-dire exécuter un script php: su www-data / usr/share/script.php ou simplement su www-data pour un shell interactif. Mais su sans nom d’utilisateur assumera le compte root (super utilisateur).
oblivian
Chaos - "shopt -q login_shell && echo 'shell de connexion' || echo 'pas de shell de connexion'" Ce genre de suggestions me voit souvent, mais pourquoi rester aussi longtemps? L'opérateur && signifie que si le code de sortie 0, alors "faire la commande suivante" et les doubles tuyaux (||) signifient else (sinon 0), alors exécutez cette commande. Donc, qu'est-ce que cela signifie fondamentalement si le code de sortie 0 puis echo "Login Shell", si le code de sortie 1 (échec) puis echo "Pas de connexion". Pourquoi ne pas simplement "shopt -q login_shell; echo $?" $? signifie le code résultat / sortie de la commande précédente. Dans la plupart des programmes, sinon tous, 0 signifie succès, 1 ou plus signifie échec. Donc, si l'écho est
égal à
2
@Paul: sudo -iest suggéré. Lisez ici: ubuntuforums.org/showthread.php?t=1817402 et ici: unix.stackexchange.com/questions/98531/...
Marco Sulla
0

Pour rechercher des différences, vous pouvez vérifier l’environnement résultant parmi différentes invocations.

Vous pourriez trouver quelques "petites" différences dans certaines variables critiques:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

ou une différence dans ~ /. traitement des fichiers de points ( ~/.config).

Pensez également à la propriété des fichiers journaux ( ~/.xsession.errors, etc ...) basés sur $ HOME ou des cookies xauth ( ~/.Xauthority) générés par les commandes.

Essayez ces commandes:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)


hute37
la source