La commande sudo ne source pas /root/.bashrc

27

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

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

Mais je le fais sudo sh -c 'echo $PATH', ça se voit, /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?


la source

Réponses:

32

.bashrcest 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, il .bashrcn'est donc pas impliqué.

sudo su; echo $PATHexécute une instance interactive du shell de root. Si c'est bash, alors ~root/.bashrcest chargé. Cet extrait de code s'exécute echo $PATHune fois que ce shell interactif se termine, donc tout ce qui se passe dans le shell interactif n'a aucune influence sur ce que le snippet 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.

Puisqu'il .bashrcest 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), ce n'est pas le bon endroit pour définir les variables d'environnement. À utiliser .bashrcpour 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 chargés lorsque vous vous connectez: ~/.pam_environmentou ~/.profile.

Définissez donc PATHau .profilelieu de .bashrcet exécutez un shell de connexion avec sudo -i 'echo $PATH'ou sourcez explicitement .profileavec sudo sh -c '. ~/.profile; echo $PATH'.

Gilles 'SO- arrête d'être méchant'
la source
1
a abordé de nombreux points pertinents sur les obus .... merci ....
1
Comment puis-je l'ajouter .profile? Voulez-vous dire /root/.profileou /home/user/.profile? J'ai essayé d'ajouter export PATH=$PATH:/mydiraux deux. Ça n'a pas marché. J'ai essayé sans export, ça n'a pas marché non plus.
falsePockets
@falsePockets N'a pas fonctionné pour quoi? Vous devriez poser une nouvelle question et expliquer exactement ce que vous faites.
Gilles 'SO- arrête d'être méchant'
La chose qui n'a pas fonctionné est exactement la même chose qu'OP essaie de faire. J'essaie d'ajouter un répertoire au CHEMIN de mon superutilisateur. Je ne devrais pas poser de nouvelle question, car cette question serait un double de cette question.
falsePockets
@falsePockets Mais évidemment vous ne faites pas la même chose pour accéder au compte superutilisateur. Et puisque vous n'avez pas dit ce que vous faites, je ne peux pas vous aider à part répéter ce qui est déjà dans ma réponse.
Gilles 'SO- arrête d'être méchant'
14

Regardez les options -Eet -i.

-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 recevra lors de 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é.

Vinz
la source
3

Vous pouvez le faire sudo bash, qui lit les bashfichiers de démarrage comme indiqué dans la bashpage de manuel / documentation. Veuillez noter, cependant, qu'il peut ne pas définir HOMEcorrectement la variable d'environnement. Cela peut être corrigé dans le bashfichier de démarrage à l' échelle du système (dans /etc, l'emplacement exact dépend de la distribution) - testez si la valeur $uidest 0.

Ned64
la source