Question 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - Quand est-ce important, ou est-ce important?


Lorsque je fais quelque chose qui nécessite de taper root des dizaines de fois de suite, je préfère passer ma session à une session racine. Dans les divers tutoriels et instructions que j'ai utilisés sur Internet, je vois sudo su, sudo su -, sudo -i et sudo /bin/bash être utilisé pour ouvrir une session racine, mais je ne suis pas clair sur la différence entre ceux-ci et quand ou si cette différence est importante.

Quelqu'un peut-il clarifier cela pour moi?


195
2017-11-12 23:30


origine


Vous avez oublié de poser des questions sur sudo -s et sudo su. - Radu Rădeanu
En relation: Différence entre "su", "sudo -s", "sudo -i" - Radu Rădeanu
En relation: Quelle est la différence entre la commande 'sudo command' et la commande 'sudo sh? - Radu Rădeanu
En relation: Quelle est la différence fonctionnelle entre sudo su et sudo -i? - Radu Rădeanu
@ RaduRădeanu Quand j'ai tapé la question dans, j'ai passé en revue 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'ils contiennent beaucoup de nouvelles informations pour moi, et merci de les avoir reliées, je les ai trouvées pas aussi complètes que la réponse fournie par l'utilisateur ci-dessous, qui est beaucoup plus conforme à ce que je cherchais. - Paul


Réponses:


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

su - La commande su est utilisé pour passer à un autre utilisateur (s sorcière tu ser), mais vous pouvez également basculer vers l'utilisateur root en appelant la commande sans paramètre. su vous demande le mot de passe de l'utilisateur à changer, après avoir tapé le mot de passe que vous avez changé pour l'environnement de l'utilisateur.

sudo - sudo est destiné à exécuter une seule commande avec les privilèges root. Mais contrairement à su il vous demande le mot de passe de l'utilisateur actuel. Cet utilisateur doit être dans le fichier sudoers (ou un groupe qui se trouve dans le fichier sudoers). Par défaut, Ubuntu "se souvient" de votre mot de passe pendant 15 minutes, ce qui vous évite de taper votre mot de passe à 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:

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

sudo su Appels sudo avec la commande su. Bash est appelé shell interactif non connecté. Donc bash n'exécute que .bashrc. Vous pouvez voir qu'après être passé en root, 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, .profile et .bashrc sont exécutés et vous vous trouverez dans le répertoire principal de root avec l'environnement root.

sudo -i C'est presque comme sudo su - L'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, .bashrc ou .login sera lu et exécuté par le shell.

sudo /bin/bash Cela signifie que vous appelez sudo avec la commande /bin/bash. /bin/bash est démarré en tant que shell non-login, donc tous les fichiers de points ne sont pas exécutés, mais bash lui-même lit .bashrc de l'utilisateur appelant. Votre environnement reste le même. Votre maison ne sera pas la maison de la racine. Donc, vous êtes root, mais dans l'environnement de l'utilisateur appelant.

sudo -slit le $SHELL variable et exécute le contenu. Si $SHELL contient /bin/bash il invoque sudo /bin/bash (voir au dessus).

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

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

257
2017-11-13 09:43



Juste une clarification: sudo permet à un utilisateur autorisé d'exécuter une commande en tant que superutilisateur ou un autre utilisateur. Quoi qu'il en soit, +1 pour vos efforts. - Radu Rădeanu
@chaos Merci pour cette excellente réponse! Cela répond principalement à mes questions, alors je suis allé de l'avant et ai marqué la réponse à la question, mais je ne comprends pas quand il est souhaitable d'exécuter un shell particulier. Je n’utilise vraiment que Ubuntu en ligne de commande et je trouve mon utilisation la plus courante pour ouvrir un root session utilisateur (vs utilisation sudo) est quand je fais quelque chose qui nécessite un usage intensif de root privilèges, par exemple lors de l'installation de quelque chose de nouveau ou lors d'une reconfiguration majeure. J'ai utilisé sudo /bin/bash, mais apparemment cette méthode a un mauvais coup pour une raison que je ne comprends pas. - Paul
En outre, il est plus "correct" de dire que su est synonyme d’utilisateur de commutateur, 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 aucun nom d'utilisateur, utilisera le compte racine (super utilisateur). - oblivian
Chaos - "shopt -q login_shell && echo 'Le shell de connexion' || echo 'Aucun shell de connexion'" Ce genre de suggestions que je vois souvent, mais pourquoi le faire si longtemps? L'opérateur && signifie que si le code de sortie 0 signifie "faire la commande suivante" et que le double-canal (||) signifie autre chose (sinon 0), exécutez cette commande. Donc, ce qu'il dit essentiellement si le code de sortie 0, puis echo "Login Shell", si le code de sortie 1 (échoue), puis écho "No login". Pourquoi ne pas simplement "shopt -q login_shell; echo $?" $? désigne le code résultat / sortie de la commande précédente. Dans la plupart sinon tous les programmes 0 signifie le succès, un ou plusieurs moyens échouent. Donc, si l'écho est 0 = succès ... - oblivian
@Paul: sudo -i est suggéré. Lire ici: ubuntuforums.org/showthread.php?t=1817402 et ici: unix.stackexchange.com/questions/98531/… - Marco Sulla