Je spécifie le chemin d'accès à ma commande dans le fichier / etc / profile :
export PATH=$PATH:/usr/app/cpn/bin
Ma commande est située dans:
$ which ydisplay
/usr/app/cpn/bin/ydisplay
Ainsi, lorsque j'exécute la sortie "echo $ PATH", cela ressemble à:
$ echo $PATH
...:/usr/app/cpn/bin
Et tout va bien, mais lorsque j'essaie de lancer ma commande via SSH, j'obtiens une erreur:
$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found
Mais mon chemin est toujours présent:
$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin
Veuillez m'expliquer pourquoi Bash n'a pas pu trouver ydisplay pendant la session SSH et comment configurer correctement SSH pour éviter ce problème.
De plus, si je spécifie $ PATH dans le fichier local .bashrc dans l'utilisateur actuel, tout fonctionne correctement. Mais je veux modifier un seul fichier au lieu de spécifier un grand nombre de fichiers pour chaque utilisateur. C'est pourquoi je demande.
ydisplay
? çassh 127.0.0.1 /usr/app/cpn/bin/ydisplay
marche?ssh 127.0.0.1 echo $PATH
ne fait pas ce que vous pourriez penser qu'il fait: la coquille se développe $ PATH avant ssh est même exécuté, de sorte que cela ne prouve pas ou quoi que ce soit réfuter.Réponses:
tl; dr
Exécuter des
ssh 127.0.0.1 ydisplay
sources~/.bashrc
plutôt que/etc/profile
. Modifiez votre chemin d'accès à la~/.bashrc
place.détails
La seule heure de
/etc/profile
lecture est lorsque votre shell est un "shell de connexion".Dans le manuel de référence de Bash :
Mais lorsque vous exécutez
ssh 127.0.0.1 ydisplay
,bash
n'est pas démarré en tant que shell de connexion. Pourtant, il lit un fichier de démarrage différent. Le manuel de référence de Bash dit:Vous devez donc mettre vos
PATH
paramètres~/.bashrc
.Sur la plupart des systèmes,
~/.bash_profile
sources~/.bashrc
, vous ne pouvez donc mettre vos paramètres que dans~/.bashrc
plutôt que de les mettre dans les deux fichiers.Il n'y a aucun moyen standard pour modifier le paramètre pour tous les utilisateurs, mais la plupart des systèmes ont un
/etc/bashrc
,/etc/bash.bashrc
ou similaire.À défaut, configurez
pam_env
etPATH
définissez le paramètre/etc/environment
.Voir également:
la source
Historiquement, les fichiers de profil (
/etc/profile
et~/.profile
) ont été invoqués lorsque vous vous êtes connecté (sur la console texte, quoi d'autre?) Et ont servi à de nombreuses fins:stty
).Tous ces objectifs n'ont été identifiés comme séparés que plus tard. Parce que les scripts de profil peuvent faire des choses qui n'ont de sens que dans une session interactive (interaction de terminal, démarrer d'autres programmes), lorsque l'invocation du shell distant ( rsh ) a été introduite, la marque de rsh a décidé de ne pas appeler le shell distant en tant que shell de connexion, afin que les scripts de profil ne soient pas exécutés. (Certaines versions de
rshd
ont une option pour exécuter le shell distant en tant que shell de connexion.) Ssh a copié ce comportement afin de remplacer directement rsh.Si vous souhaitez exécuter vos scripts de profil, vous pouvez les invoquer explicitement.
Notez la commande
.
pour charger les scripts de profil à l'intérieur du shell: ce sont des commandes à exécuter à l'intérieur de ce shell, pas un programme externe.Si vous souhaitez définir une variable d'environnement globalement pour tous les utilisateurs, il existe une autre méthode sur de nombreux systèmes: au lieu de la définir dans
/etc/profile
, définissez-la dans/etc/environment
. Ce fichier est lu dans lepam_env
module; la plupart des distributions Linux sont configurées pour le lire.Si votre shell de connexion est bash, il existe une autre possibilité. Normalement, vous ne devez pas définir de variables d'environnement dans
.bashrc
(car elles ne seront pas définies dans les sessions X, sauf si vous passez par un terminal avec un shell interactif, car elles ne seront pas définies si vous vous connectez de manière interactive sur une console de texte ou sur ssh, car ils remplaceront les paramètres personnalisés si vous appelez un shell dans un autre programme). Cependant, bash a une caractéristique étrange que je n'ai jamais comprise: il se lit~/.bashrc
dans deux circonstances indépendantes:rshd
ousshd
.Lorsque vous exécutez une commande sur ssh, vous êtes dans le deuxième cas. Vous pouvez faire en sorte que votre profil soit lu par lecture
/etc/profile
et à.profile
partir de.bashrc
. Incluez le code suivant dans votre~/.bashrc
:la source