web-dev-qa-db-fra.com

la commande sudo ne source pas /root/.bashrc

J'ai ajouté un chemin d'accès personnalisé à la variable PATH dans mon fichier /root/.bashrc

Quand je fais Sudo su; echo $PATH, il affiche l'entrée "/ path/to/custom/bins".

Mais je fais Sudo sh -c 'echo $PATH', ça montre, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Les chemins de dossier ajoutés dans le fichier .bashrc ne sont pas visibles.

La commande Sudo n'a-t-elle pas le même environnement qu'un utilisateur root?

28
user93868

.bashrc est un fichier de configuration de bash, uniquement lorsqu'il est exécuté de manière interactive. Il n'est chargé que lorsque vous démarrez bash, pas lorsque vous exécutez un autre programme tel que sh (pas même si bash est appelé via le nom sh). Et il n'est chargé que lorsque bash est interactif, pas lorsqu'il exécute un script ou une commande avec -c.

Sudo sh -c 'echo $PATH' ou Sudo bash -c 'echo $PATH' n'invoque pas un shell interactif, donc .bashrc n'est pas impliqué.

Sudo su; echo $PATH exécute une instance interactive du shell de root. Si c'est bash, alors ~root/.bashrc est chargé. Cet extrait exécute echo $PATH une fois ce shell interactif terminé, tout ce qui se passe dans le shell interactif n'a donc aucune influence sur ce que l'extrait imprime à la fin. Mais si vous tapez echo $PATH à l'invite du shell interactif démarré par Sudo su, vous verrez la valeur définie par ~root/.bashrc.

Depuis .bashrc est invoqué dans chaque shell interactif, pas par les shells de connexion (pas même par les shells de connexion interactifs, qui est un défaut de conception dans bash), c'est le mauvais endroit pour définir les variables d'environnement. Utilisation .bashrc pour les paramètres de bash interactifs tels que les raccourcis clavier, les alias et les paramètres d'achèvement. Définissez les variables d'environnement dans les fichiers qui sont chargés lorsque vous vous connectez: ~/.pam_environment ou ~/.profile.

Définissez donc PATH dans .profile au lieu de .bashrc, et exécutez un shell de connexion avec Sudo -i 'echo $PATH', ou explicitement source .profile avec Sudo sh -c '. ~/.profile; echo $PATH'.

Regarde le -E et -i options.

-E: Indique à la politique de sécurité que l'utilisateur souhaite conserver ses variables d'environnement existantes. La politique de sécurité peut renvoyer une erreur si l'utilisateur n'est pas autorisé à préserver l'environnement.

-i: Exécutez 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 ou .login seront lus par le shell. Si une commande est spécifiée, elle est transmise au Shell pour exécution via l'option -c du Shell. Si aucune commande n'est spécifiée, un shell interactif est exécuté. Sudo tente de passer au répertoire personnel de cet utilisateur avant d'exécuter le shell. La commande est exécutée avec un environnement similaire à celui qu'un utilisateur recevrait à la connexion. La section Environnement de commande du manuel sudoers (5) décrit comment l'option -i affecte l'environnement dans lequel une commande est exécutée lorsque la stratégie sudoers est utilisé.

14
Vinz

Vous pourriez Sudo bash, qui lit les fichiers de démarrage bash comme indiqué dans la page de manuel/documentation de bash. Veuillez noter, cependant, qu'il peut ne pas définir correctement la variable d'environnement HOME. Cela peut être résolu dans le fichier de démarrage du système bash (dans /etc, l'emplacement exact dépend de la distribution) - testez si $uid est 0.

3
Ned64