Wie führt ssh einen Befehl aus?

15

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 declareum einen eingebauten Bash, während mountes 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?

Cyker
quelle
2
ssh starte immer deine shell, die in gespeichert ist /etc/passwd. Wenn /usr/sbin/nologinSie sich nicht anmelden können
Ipor Sircer

Antworten:

21

Das sshführt die Befehle aus, die Sie in der Shell des Remotebenutzers (von der /etc/passwd) bereitgestellt haben, wie im Quellcode ersichtlich :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

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 bashund 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.

Jakuje
quelle
Wenn eine Shell immer vom ssh-Daemon gestartet wird, ist es interessant, wenn der Benutzer ssh mit einem Befehl aufruft, dann ist diese Shell keine Login-Shell, selbst wenn der Benutzer eine Art Login durchgeführt hat. Irgendeine Idee?
Cyker
Ja. Die Shell, die den Befehl ausführt, ist 1) Keine Anmeldeshell 2) Nicht interaktiv. Sie können die Interaktivität über den -tSchalter erzwingen , aber die RC-Dateien werden trotzdem nicht geladen.
Jakuje
1
Beachten Sie, dass sshd(der Server) dies tut, nicht ssh(der Client).
ysdx
@ysdx Sie arbeiten zusammen. Der Client weist den Server an, den Befehl über eine Shell auszuführen, und der Server führt den Befehl aus.
Barmar