La command sudo ne source pas /root/.bashrc

J'ai ajouté un path d'access personnalisé à la variable PATH dans mon file /root/.bashrc

Quand je fais sudo su; echo $PATH sudo su; echo $PATH , il affiche l'input '/ path / to / custom / bins'.

Mais je fais sudo sh -c 'echo $PATH' , il montre, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Les paths de dossier ajoutés dans le file .bashrc ne sont pas visibles.

La command sudo n'a-t-elle pas le même environnement qu'un user root?

.bashrc est un file de configuration de bash, seulement quand 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 (même si bash est invoqué via le nom sh ). Et il est seulement chargé quand bash est interactif, pas quand il exécute un script ou une command 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 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 que ce shell interactif se termine, donc quoi qu'il arrive dans le shell interactif n'a aucune influence sur ce que l'extrait de code imprime à la fin. Mais si vous tapez echo $PATH à l'invite du shell interactif démarré par sudo su , vous verrez la valeur de ~root/.bashrc .

Puisque .bashrc est invoqué dans chaque shell interactif, pas par des shells de connection (même pas par des shells de connection interactifs, ce qui est un défaut de design dans bash), c'est le mauvais endroit pour définir les variables d'environnement. Utilisez .bashrc pour les parameters interactifs bash tels que les raccourcis keyboard, les alias et les parameters d'achèvement. Définissez les variables d'environnement dans les files chargés lors de la connection: ~/.pam_environment ou ~/.profile .

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

Regardez les options -E et -i .

-E : indique à la stratégie de security que l'user souhaite conserver ses variables d'environnement existantes. La politique de security peut renvoyer une erreur si l'user n'a pas l'autorisation de préserver l'environnement.

-i : Exécute le shell spécifié par l'input de database du mot de passe de l'user cible en tant que shell de connection. Cela signifie que les files de ressources spécifiques à la connection tels que .profile ou .login seront lus par le shell. Si une command est spécifiée, elle est transmise au shell pour être exécutée via l'option -c du shell. Si aucune command n'est spécifiée, un shell interactif est exécuté. sudo tente de passer au directory de base de cet user avant d'exécuter le shell. La command est exécutée avec un environnement similaire à celui qu'un user recevrait lors de la connection. La section Environnement de command du manuel sudoers (5) explique comment l'option -i affecte l'environnement dans lequel une command est exécutée lorsque la stratégie sudoers est utilisé.

Vous pouvez sudo bash , qui lit les files de démarrage bash comme indiqué dans la page de manuel / documentation de bash . Notez cependant qu'il ne peut pas définir correctement la variable d'environnement HOME . Cela peut être corrigé dans le file de démarrage bash échelle du système (dans /etc , l'location exact dépend de la dissortingbution) – testez si le $uid est 0.