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 pwd
sowohl 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
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Antworten:
BASH_ENV
wird 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_login
und~/.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.
BASH_ENV
Variable wird durchgereicht. Beachten Sie, dass dies möglicherweise in einer Quelldatei enthalten ist.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 bash
für die vollständige Liste.PAM : Wie in den Kommentaren angegeben, überprüfen Sie
/etc/security/pam_env.conf
und alle zusätzlichen Dateien, auf die von verwiesen wirdpam_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 wennPermitUserEnvironment
in aktiviertsshd_config
)~/.ssh/rc
(nach dem Wechsel in das Home-Verzeichnis; immer)/etc/ssh/sshrc
(falls~/.ssh/rc
nicht vorhanden)Hinweis:
sshd
Sucht auch nachenvironment=value
Zeilen in der Datei mit den autorisierten Schlüsseln des Benutzers (sofernPermitUserEnvironment
aktiviert). Auf der Manpage ist jedoch nicht ersichtlich, in welcher Reihenfolge dieser Schritt ausgeführt wird.quelle
PermitUserEnvironment yes
ist 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.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 habesshd
), die die Umgebung einstellt.