Sur ma machine virtuelle Fedora, lors de l'exécution avec mon compte d'utilisateur, j'ai /usr/local/bin
sur mon chemin:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Et de même lors de l'exécution su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Cependant, lors de l'exécution via sudo
, ce répertoire n'est pas dans le chemin:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Pourquoi le chemin serait-il différent lors de l'exécution via sudo
?
sudo
préserver $ PATH?Réponses:
Regarde
/etc/sudoers
. Le fichier par défaut dans Fedora (ainsi que dans RHEL et Ubuntu et similaire) comprend cette ligne:Ce qui garantit la propreté de votre chemin lorsque vous exécutez des fichiers binaires sous sudo. Cela aide à se protéger contre certaines des préoccupations mentionnées dans cette question . C'est également pratique si vous n'en avez pas
/sbin
et/usr/sbin
sur votre propre chemin.la source
/usr/local/bin
à cette directive alors je voudrais le voir sur mon chemin lors de l' exécution par l' intermédiairesudo
, non?/usr/local/bin
. Merci beaucoup d'avoir expliqué cela!sudo
par exemple un script dans votre~/bin
(ou le chemin que vous utilisez)? Je viens de faire le changement - cela fonctionne, seulement pensé qu'il pourrait y avoir un revers?La commande
su -
exécutera le chemin le profil de l' utilisateur root et de prendre sur l'environnement de l'utilisateur , y compris etc.sudo
ne le fait pas.Si vous voulez vous
sudo
comporter commesu -
alors utilisez l'optionsudo -i [command
qui exécutera le profil de l'utilisateurSi vous souhaitez
su -
vous comporter commesudo
ceci, n'utilisez pas le trait d'union - utilisez simplementsu [command]
la source
Vous pouvez vérifier pourquoi (c'est différent) en exécutant
sudo sudo -V
.Par exemple sous Linux, lancez:
Remarque: sous Mac OS / BSD, il suffit d' exécuter:
sudo sudo -V
.La liste ci-dessus est restreinte en raison du plug-in de politique de sécurité par défaut dans certaines distributions Linux.
Ceci est expliqué plus en détail dans
man sudoers
:Si c'est le cas, vous pouvez modifier cela en exécutant
sudo visudo
et en modifiant le fichier de configuration et en modifiant votresecure_path
(ajout d'un chemin supplémentaire séparé par:
) ou en ajoutant votre utilisateur dansexempt_group
(afin que vous ne soyez pas affecté par lessecure_path
options).Ou afin de passer
PATH
temporaire de l'utilisateur , vous pouvez exécuter:et vous pouvez vérifier cela en:
Voir aussi: Comment faire
sudo
conserver$PATH
?Une autre raison pour laquelle l’environnement pourrait être différent
sudo
, c’est parce que l’env_reset
option pourrait être activée dans votresudoers
fichier. Cela provoque l'exécution de commandes avec un nouvel environnement minimal.Vous pouvez donc utiliser l'
env_keep
option (non recommandée pour des raisons de sécurité ) pour préserver les variables d'environnement de votre utilisateur:la source
Dans la plupart des linux, vous installez des programmes via la gestion des paquets et vous obtenez des mises à jour de manière régulière. Si vous installez quelque chose qui contourne la gestion des paquets, il sera installé dans / usr / local / bin (par exemple, ou ... / sbin, ou / opt) et ne recevra pas de mises à jour régulières.
Je suppose donc que les programmes ne sont pas considérés comme sécurisés et ne sont pas intégrés par défaut à PATH.
la source
sudo
l’exclusion de ce répertoire aurait été exclue par défaut.Je viens d’essayer cela moi-même et je n’ai pas vu le comportement que vous observiez - mon chemin est resté le même, alors peut-être que votre configuration sudo est différente. Si vous vérifiez,
man sudoers
vous verrez qu'il existe une option appeléesecure_path
réinitialisationPATH
- il semble que cette option a peut-être été activée.la source
Parce que lorsque vous utilisez
sudo bash
,bash
ne pas agir comme un shell de connexion. Réessayez avecsudo bash -l
et vous devriez voir le même résultat quesu -
.Si cela est exact, alors la différence
PATH
réside dans les fichiers de configuration:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
sont exécutés (dans cet ordre) pour un shell de connexion, tout~/.bashrc
est exécuté pour un shell interactif sans connexion.la source
Vieille question, je sais, mais je suis tombé ici tout à l’heure parce que j’enquêtais sur ce problème précis.
Pour une raison quelconque
/usr/local/bin
était seulement dans le PATH en devenant root viasudo su -
. Lors de l'utilisation,sudo -i
il n'était pas là. Bien sûr, je sais maintenant que je peux l'ajouter à / etc / sudoers, mais cela n'explique toujours pas pourquoi il est déjà là aprèssu -
. D'où vient cette partie de PATH?Après beaucoup de recherches et de recherches, j'ai trouvé la réponse:
Le chemin par défaut contenant '/ usr / local / bin' est en réalité codé en dur en su (1).
Donc, aucune configuration pam, profil, bashrc ou quoi que ce soit n'était responsable de l'ajout sélectif de cet élément. Il était toujours déjà là quand
su
a repris. Et commesudo
n’invoque passu
du tout mais utilise sa propre configuration, il lui manquait aprèssudo -i
J'ai trouvé que cela était vrai sur RHEL6 et RHEL7. Je n'ai vérifié aucune autre version ou distribution.
la source
su
binaire au format hexadécimal , changé/usr/local/bin
en autre chose et appelé la copie. Mon chemin contenait maintenant la chaîne modifiée ... De bons enfants et des administrateurs système non fainéants bien sûr, il suffit de télécharger la source et de s’enregistrer ici. ;-)