web-dev-qa-db-fra.com

Y a-t-il jamais une bonne raison de diriger Sudo su?

Pour lancer un shell racine sur des machines où le compte root est désactivé, vous pouvez exécuter l'un des éléments suivants:

  • Sudo -i: Exécutez un shell de connexion interactif (lit /root/.bashrc Et /root/.profile)
  • Sudo -s: Exécutez un shell interactif sans connexion (lit /root/.bashrc)

Dans le monde Ubuntu, je vois très souvent Sudo su Suggéré comme un moyen d'obtenir un shell racine. Pourquoi exécuter deux commandes distinctes quand on le fera? Autant que je sache, Sudo -i Est équivalent à Sudo su - Et Sudo -s Est le même que Sudo su.

Les seules différences semblent être (en comparant Sudo -i À gauche et Sudo su - À droite):

screenshot of meld comparing 'Sudo -i' and 'Sudo su -'

Et en comparant Sudo -s (À gauche) et Sudo su (À droite):

screenshot of meld comparing 'Sudo -s' and 'Sudo su'

Les principales différences (en ignorant les variables Sudo_foo Et LS_COLORS) Semblent être les variables système XDG_foo Dans les versions Sudo su.

Y a-t-il des cas où cette différence justifie l'utilisation du Sudo su Plutôt inélégant? Puis-je dire aux gens (comme je l'ai souvent fait) en toute sécurité qu'il est inutile de lancer Sudo su Ou est-ce que je manque quelque chose?

80
terdon

Comme vous l'avez dit dans votre question, la principale différence est l'environnement.

Sudo su - contre. Sudo -i

En cas de Sudo su - c'est un shell de connexion, donc /etc/profile, .profile et .bashrc sont exécutés et vous vous retrouverez dans le répertoire personnel de root avec l'environnement de root.

Sudo -i est presque identique à Sudo su - Le -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 su contre. Sudo -s

Sudo su appelle Sudo avec la commande su. Bash est appelé Shell interactif sans connexion. Donc bash exécute uniquement .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 -s lit le $Shell variable et exécute le contenu. Si $Shell contient /bin/bash il invoque Sudo /bin/bash, ce qui signifie que /bin/bash est démarré en tant que Shell sans connexion, donc tous les fichiers dot 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 root. Vous êtes donc root, mais dans l'environnement de l'utilisateur appelant.

Conclusion

Le -i L'indicateur a été ajouté à Sudo dans 2004 , pour fournir une fonction similaire à Sudo su -, donc Sudo su - était le modèle pour Sudo -i et destiné à fonctionner comme ça. Je pense que peu importe ce que vous utilisez, à moins que l'environnement ne soit pas important.

Une addition

Un point de base qui doit être mentionné ici est que Sudo a été conçu pour exécuter uniquement une seule commande avec des privilèges plus élevés, puis supprimer ces privilèges aux originaux. Il n'a jamais été conçu pour vraiment changer l'utilisateur et laisser ouvert un shell racine. Au fil du temps, Sudo a été développé avec de tels mécanismes, car les gens étaient ennuyés de savoir pourquoi utiliser Sudo devant chaque commande.

La signification de Sudo a donc été abusée. Sudo était destiné à encourager l'utilisateur à minimiser l'utilisation des privilèges root.

Ce que nous avons maintenant, c'est que Sudo devient de plus en plus populaire. Il est intégré dans presque toutes les distributions Linux connues. L'outil d'origine pour basculer vers un autre compte d'utilisateur est su. Pour un vétéran de la vieille école * nix, une chose comme Sudo peut sembler inutile. Il ajoute de la complexité et se comporte plus probablement aux mécanismes que nous connaissons de la famille os Microsofts, et est donc contraire à la philosophie de la simplicité des systèmes * nix.

Je ne suis pas vraiment un vétéran, mais aussi à mon avis Sudo a toujours été une épine à mes côtés, depuis l'époque où il a été introduit et j'ai toujours travaillé autour de l'utilisation de Sudo, si cela était possible. Je suis plus réticent à utiliser Sudo. Sur tous mes systèmes, le compte root est activé. Mais les choses changent, peut-être que le moment viendra où su sera obsolète et Sudo remplacera su complètement.

Par conséquent, je pense qu'il sera préférable d'utiliser les mécanismes internes de Sudo (-s, -i) au lieu de compter sur un ancien outil tel que su.

64
chaos

Pour répondre directement à votre question: non, il n'y a aucune bonne raison de le faire. De plus, Sudo su produit deux entrées de journal quand une suffit.

J'ai vu beaucoup de gens faire ça, et quand je demande pourquoi ils ne courent pas simplement Sudo -s, la réponse est simplement qu'ils ne connaissent pas le -s drapeau à Sudo, et généralement ils changent après que je le signale.

Cependant, à votre liste de Sudo -s et Sudo -i, J'aimerais ajouter une autre option, Sudo -sE, qui remplace en quelque sorte su -m. Sudo -sE préserve votre environnement, y compris le répertoire personnel. Cela présente des risques si votre répertoire personnel n'est pas sécurisé (sur NFS). Mais dans un environnement où beaucoup de gens utilisent root, cela vous évite d'avoir à vous mettre d'accord sur le contenu de la racine .bashrc fichier. Ma .bashrc contient de nombreuses spécialisations pour root, donc je n'ai pas exactement le même environnement que root, mais au moins j'obtiens exactement l'environnement que je veux.

17
user3188445