Ich verwende Bash sowohl auf dem Client als auch auf dem Server. Wenn Sie einen Befehl über SSH ausführen:
ssh <host> 'declare'
gibt eine Liste von Shell-Variablen an.ssh <host> 'mount'
gibt eine Liste von Mountpunkten an.
Es handelt sich jedoch declare
um einen eingebauten Bash, während mount
es sich um einen externen Befehl handelt. Woher weiß SSH, was ausgeführt werden soll, wenn auf dem Server eine integrierte Shell und ein externer Befehl mit demselben Namen vorhanden sind?
/etc/passwd
. Wenn/usr/sbin/nologin
Sie sich nicht anmelden könnenAntworten:
Das
ssh
führt die Befehle aus, die Sie in der Shell des Remotebenutzers (von der/etc/passwd
) bereitgestellt haben, wie im Quellcode ersichtlich :Daher lauten die entsprechenden Befehle, die für Ihr Beispiel auf dem Remote-Server ausgeführt werden:
bash -c declare
bash -c mount
Beide werden an die übergeben
bash
und ausgewertet. Die eingebauten Funktionen werden im Inneren ausgewertet, und die externen Befehle werden so aufgerufen, als würden Sie dies über die lokale Eingabeaufforderung tun.quelle
-t
Schalter erzwingen , aber die RC-Dateien werden trotzdem nicht geladen.sshd
(der Server) dies tut, nichtssh
(der Client).