Où est généralement $ BASH_ENV?

19

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 pwdfois 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

Basilic
la source
1
/ Etc / passwd est-il identique sur les deux serveurs? Si bash est appelé "/ bin / sh" au lieu de "/ bin / bash", il ne lira aucun fichier bashrc (uniquement les fichiers de profil).
freiheit
Pas identique, mais l'utilisateur auquel j'envoie des commandes a la même ligne dans / etc / passwd sur les deux systèmes.
Basil
Et qu'en est-il de ~ / .profile et ~ / .bash_profile?
freiheit
ils sont identiques et contiennent tous les deuxif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Basil
Vous avez vérifié que / etc / bashrc et /etc/profile.d/* sont identiques? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Réponses:

21

BASH_ENVne 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_loginet ~/.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é.

  • Une BASH_ENVvariable exportée sera transmise. Gardez à l'esprit que cela peut être enterré dans un fichier source.
  • Il peut être introduit en tant que paramètre sur la même ligne appelant le script, c'est-à-dire 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 bashpour la liste exhaustive.

  • PAM : Comme le suggère freiheit dans les commentaires, vérifiez /etc/security/pam_env.confet tout fichier supplémentaire référencé par pam_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 si PermitUserEnvironmentest activé dans sshd_config)
    • ~/.ssh/rc (après avoir changé pour le répertoire personnel; toujours)
    • /etc/ssh/sshrc(s'il ~/.ssh/rcn'est pas présent)

Remarque: sshdrecherchera également les environment=valuelignes dans le fichier de clés autorisées de l'utilisateur (s'il PermitUserEnvironmentest activé), mais il n'est pas clair dans la page de manuel où cette étape se situe dans la séquence ci-dessus.

Andrew B
la source
J'ai trouvé une différence! PermitUserEnvironment yesest 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.
Basil
Oh, je pense que je dois réinitialiser ssh? /etc/init.d/sshd?
Basil
@Basil Oui, vous devez redémarrer 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 fournis sshd) qui définit l'environnement.
Andrew B
Oui, c'était la partie frustrante - tout ce dont j'ai besoin est défini dans .bashrc, qui n'était tout simplement pas en cours d'exécution :) Merci beaucoup pour votre aide - Je planifie un changement pour réinitialiser SSH et je ferai rapport. Je suppose que ça marchera.
Basil
Je viens de terminer la réinitialisation de SSH et mes commandes SSH non interactives fonctionnent maintenant! Merci beaucoup pour votre aide, je n'aurais jamais trouvé ce champ par moi-même.
Basil