311 votes

sudo su -' vs 'sudo -i' vs 'sudo /bin/bash' - quand est-ce que ça compte de savoir lequel des deux est utilisé, ou est-ce que ça compte tout court ?

Lorsque je fais quelque chose qui nécessite de taper root des dizaines de fois d'affilée, je préfère basculer ma session vers une session root. Dans les différents tutoriels et instructions que j'ai utilisés sur Internet, je vois sudo su , sudo su - , sudo -i y sudo /bin/bash est utilisé pour ouvrir une session racine, mais je ne sais pas exactement quelle est la différence entre les deux et quand ou si cette différence est importante.

Quelqu'un peut-il éclaircir ce point pour moi ?

419voto

chaos Points 25386

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 u ser), mais vous pouvez également passer à l'utilisateur root en invoquant la commande sans paramètre. su vous demande le mot de passe de l'utilisateur à basculer, après avoir tapé le mot de passe vous avez basculé dans l'environnement de l'utilisateur.
  • sudo - sudo est destiné à exécuter une seule commande avec les privilèges de l'administrateur. 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 est dans le fichier sudoers). Par défaut, Ubuntu "se souvient" de votre mot de passe pendant 15 minutes, afin que vous n'ayez pas à le taper à chaque fois.
  • bash - Une interface texte pour interagir avec l'ordinateur. Il est important de comprendre la différence entre les shells avec et sans connexion, interactifs et non interactifs :

Types de coquillages :

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

Donc les cas sont :

  • sudo su Appels sudo avec la commande su . Bash est appelé comme un Shell interactif sans login. Ainsi, Bash n'exécute que .bashrc . Vous pouvez voir qu'après le passage en tant que 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 login Shell, donc /etc/profile , .profile y .bashrc sont exécutés et vous vous retrouverez dans le répertoire personnel de root avec l'environnement de root.

  • sudo -i C'est presque la même chose que sudo su - L'option -i (simuler le login initial) exécute le Shell spécifié par l'entrée de la base de données des mots de passe de l'utilisateur cible comme un login Shell. Cela signifie que les fichiers de ressources spécifiques à la connexion, tels que .profile , .bashrc o .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é comme non-login Shell donc tous les fichiers point ne sont pas exécutés, mais bash lui-même lit .bashrc de l'utilisateur qui appelle. Votre environnement reste le même. Votre domicile ne sera pas le domicile de root. Vous êtes donc root, mais dans l'environnement de l'utilisateur qui vous appelle.

  • sudo -s lit le $SHELL et exécute le contenu. Si $SHELL contient /bin/bash il invoque sudo /bin/bash (voir ci-dessus).

Vérifiez :

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'

5voto

hute37 Points 51

Pour rechercher les différences, vous pouvez analyser l'environnement résultant entre différentes invocations.

Vous pourriez trouver des "petit" des différences dans certaines variables critiques :

  • PATH , LD_LIBRARY_PATH , LD_PRELOAD

ou une différence dans ~/. Dotfiles la manipulation ( ~/.config ).

Considérez également la propriété des fichiers journaux basés sur $HOME ( ~/.xsession.errors etc ...) ou des cookies xauth ( ~/.Xauthority ) que les commandes génèrent.

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)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X