Wo wird normalerweise $ BASH_ENV gesetzt?

19

Ich habe zwei Linux-Server, die identisch konfiguriert werden sollten, jedoch schlagen ssh-Befehle für einen von ihnen für Befehle fehl, für die ein in ~ / .bashrc angegebener Pfad erforderlich ist. Ich kann beispielsweise einen Befehl pwdsowohl interaktiv als auch über ssh verwenden. Wenn ich jedoch versuche, ein Programm auszuführen, das sich in einem Anwendungsordner befindet, funktioniert dies nur in einer interaktiven Shell für einen der Server.

Die Dateien / etc / profile und / etc / environment auf beiden Servern sind identisch, jedoch ist $ BASH_ENV auf dem Server, der ordnungsgemäß funktioniert, auf ~ / .bashrc gesetzt. Ich möchte $ BASH_ENV auf dem Server einrichten, der nicht funktioniert, aber ich würde es vorziehen, ihn an derselben Stelle einzurichten, an der er auf dem Arbeitsserver eingerichtet ist. Was sind die Orte, an denen Linux zum Zeitpunkt einer nicht interaktiven Anmeldung ausgeführt wird, z. B. ein ssh-Befehl von einem anderen Computer?

edit: Die Zeile in / etc / passwd für den Benutzer gibt auf beiden Servern / bin / bash an. Die Datei ~ / .bash_profile für beide Server ist identisch und enthält if [ -f ~/.bashrc ]; then . ~/.bashrc; fi. Der einzige Unterschied zwischen den Systemen besteht darin, dass $ BASH_ENV eine Nullzeichenfolge auf dem Server ist, die nicht funktioniert, und ich kann nicht feststellen, wo sie auf dem Server festgelegt wurde, der funktioniert.

edit 2: Die Datei ~ / .ssh / environment auf beiden Servern hat BASH_ENV = ~ / .bashrc

Basilikum
quelle
1
Ist / etc / passwd auf beiden Servern identisch? Wenn bash als "/ bin / sh" anstelle von "/ bin / bash" aufgerufen wird, werden keine bashrc-Dateien (nur Profildateien) gelesen.
freiheit
Nicht identisch, aber der Benutzer, dem ich Befehle sende, hat auf beiden Systemen dieselbe Zeile in / etc / passwd.
Basil
Und was ist mit ~ / .profile und ~ / .bash_profile?
freiheit
Sie sind identisch und beide enthaltenif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Basil
Sie haben überprüft, dass / etc / bashrc und /etc/profile.d/* identisch sind? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Antworten:

21

BASH_ENVwird nur über die Umgebung oder ein anderes Skript festgelegt, das während der Initialisierung verwendet wird. Bei einer nicht interaktiven Shell wird nur versucht, zusätzliche Dateien zu beschaffen, wenn diese Shell auch eine Anmeldeshell ist. (In diesem Fall wird es lesen ~/.bash_profile, ~/.bash_loginund ~/.profile... aber wenn es das tun würde, würden Sie kein Problem auftreten.)

Der erste Ort, an dem Sie nachsehen müssen, ist die Umgebung, in der die Subshell aufgerufen wird.

  • Eine exportierte BASH_ENVVariable wird durchgereicht. Beachten Sie, dass dies möglicherweise in einer Quelldatei enthalten ist.
  • Es kann als Parameter in derselben Zeile eingegeben werden, die das Skript aufruft, d BASH_ENV=blah /path/to/somecommand.sh. H. Das fällt auf wie ein schmerzender Daumen, also hättest du ihn wahrscheinlich erwischt.

Wenn es nach der Anmeldung festgelegt wird, Sie aber nicht herausfinden können, wo es sich befindet, müssen Sie sich möglicherweise ansehen, was für die Erstellung der Anmeldeumgebung verantwortlich ist.

  • Alle üblichen Dateien, die von einer Login-Shell bezogen werden. man bashfür die vollständige Liste.

  • PAM : Wie in den Kommentaren angegeben, überprüfen Sie /etc/security/pam_env.confund alle zusätzlichen Dateien, auf die von verwiesen wird pam_env.so. Andere PAM-Module könnten ebenfalls dafür verantwortlich sein, aber wenn Ihre PAM-Konfigurationen identisch aussehen, ist dies wahrscheinlich nicht der Fall.

  • sshd : Die folgenden Dateien werden nacheinander durchsucht :

    • ~/.ssh/environment(vor dem Wechsel in das Home-Verzeichnis; nur wenn PermitUserEnvironmentin aktiviert sshd_config)
    • ~/.ssh/rc (nach dem Wechsel in das Home-Verzeichnis; immer)
    • /etc/ssh/sshrc(falls ~/.ssh/rcnicht vorhanden)

Hinweis: sshdSucht auch nach environment=valueZeilen in der Datei mit den autorisierten Schlüsseln des Benutzers (sofern PermitUserEnvironmentaktiviert). Auf der Manpage ist jedoch nicht ersichtlich, in welcher Reihenfolge dieser Schritt ausgeführt wird.

Andrew B
quelle
Ich habe einen Unterschied gefunden! PermitUserEnvironment yesist in / etc / ssh / sshd_config auf dem Arbeitsserver eingestellt, aber nicht das Problem. Ich habe es geändert, aber ich habe gerade einen Befehl getestet und es hat nicht wieder funktioniert. Wird diese Datei jedes Mal analysiert, wenn ich versuche, ssh in zu schreiben? Ich habe kein ~ / .ssh / rc für den Benutzer, an dem ich arbeite, und es gibt keine / etc / ssh / sshrc-Datei auf beiden Systemen.
Basil
Oh, ich denke, ich muss ssh neu initialisieren? /etc/init.d/sshd?
Basil
@Basil Ja, du musst neu starten sshd. Dies bedeutet auch, dass sich möglicherweise eine Datei auf dem Arbeitsserver befindet (überprüfen Sie die Liste der Dateien, für die ich Ihnen eine Liste gegeben habe sshd), die die Umgebung einstellt.
Andrew B
Ja, das war der frustrierende Teil - alles, was ich brauche, ist in .bashrc eingestellt, das gerade nicht ausgeführt wurde :) Vielen Dank für Ihre Hilfe - ich plane eine Änderung, um SSH neu zu initialisieren, und ich melde mich zurück. Ich gehe davon aus, dass es funktionieren wird.
Basil
Ich habe gerade die Neuinitialisierung von SSH abgeschlossen und meine nicht interaktiven SSH-Befehle funktionieren jetzt! Vielen Dank für Ihre Hilfe, ich hätte dieses Feld alleine nie gefunden.
Basil