J'ai des serveurs Linux jumeaux qui devraient être configurés de manière identique, mais les commandes ssh vers l'un d'entre eux échouent pour les commandes qui nécessitent un chemin spécifié dans ~ / .bashrc. Par exemple, je peux utiliser une commande comme à la pwd
fois de manière interactive et via ssh, mais si j'essaie d'exécuter un programme situé dans un dossier bin d'application, il ne fonctionne que dans un shell interactif pour l'un des serveurs.
Le fichier / etc / profile et / etc / environment sur les deux serveurs sont identiques, cependant $ BASH_ENV est défini sur ~ / .bashrc sur le serveur qui fonctionne correctement. Je veux définir $ BASH_ENV sur le serveur qui ne fonctionne pas, mais je préférerais le définir au même emplacement que celui défini sur le serveur de travail. Quels sont les emplacements que Linux exécutera lors d'une connexion non interactive, comme une commande ssh à partir d'un autre ordinateur?
edit: La ligne dans / etc / passwd pour l'utilisateur spécifie / bin / bash sur les deux serveurs. Le fichier ~ / .bash_profile pour les deux serveurs est identique et contient if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
. La seule différence entre les systèmes est que $ BASH_ENV est une chaîne nulle sur le serveur qui ne fonctionne pas, et je ne trouve pas où elle a été définie sur le serveur qui fonctionne.
modifier 2: le fichier ~ / .ssh / environnement sur les deux serveurs a BASH_ENV = ~ / .bashrc
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Réponses:
BASH_ENV
ne sera défini que via l'environnement ou un autre script provenant de l'initialisation. Pour un shell non interactif, il essaiera de source des fichiers supplémentaires uniquement si ce shell est également un shell de connexion. (dans ce cas, il lira~/.bash_profile
,~/.bash_login
et~/.profile
... mais s'il le faisait, vous ne rencontreriez pas de problème)Le premier endroit à regarder est l'environnement dans lequel le sous-shell est invoqué.
BASH_ENV
variable exportée sera transmise. Gardez à l'esprit que cela peut être enterré dans un fichier source.BASH_ENV=blah /path/to/somecommand.sh
. Cela se démarque comme un pouce endolori donc vous l'auriez probablement attrapé.Si elle est définie après votre connexion mais que vous ne savez pas où, vous devrez peut-être regarder ce qui est responsable de la construction de l'environnement de connexion.
Tous les fichiers habituels qui proviennent d'un shell de connexion.
man bash
pour la liste exhaustive.PAM : Comme le suggère freiheit dans les commentaires, vérifiez
/etc/security/pam_env.conf
et tout fichier supplémentaire référencé parpam_env.so
. D'autres modules PAM pourraient également être responsables, mais si vos configurations PAM semblent identiques, ce n'est probablement pas le cas.sshd : Il analysera les fichiers suivants, dans l'ordre:
~/.ssh/environment
(avant de passer au répertoire personnel; uniquement siPermitUserEnvironment
est activé danssshd_config
)~/.ssh/rc
(après avoir changé pour le répertoire personnel; toujours)/etc/ssh/sshrc
(s'il~/.ssh/rc
n'est pas présent)Remarque:
sshd
recherchera également lesenvironment=value
lignes dans le fichier de clés autorisées de l'utilisateur (s'ilPermitUserEnvironment
est activé), mais il n'est pas clair dans la page de manuel où cette étape se situe dans la séquence ci-dessus.la source
PermitUserEnvironment yes
est défini dans / etc / ssh / sshd_config sur le serveur de travail, mais pas celui qui pose problème. Je l'ai changé, mais je viens de tester une commande et cela n'a plus fonctionné. Est-ce que ce fichier est analysé à chaque fois que j'essaie de ssh? Je n'ai pas de fichier ~ / .ssh / rc pour l'utilisateur sur lequel je travaille, et il n'y a pas de fichier / etc / ssh / sshrc sur les deux systèmes.sshd
. Cela signifie également qu'il peut y avoir un fichier sur le serveur de travail (vérifiez la liste de ceux que je vous ai fournissshd
) qui définit l'environnement.