Ich habe die Fragen und Antworten über die Notwendigkeit gesehen, die Argumente für Remote-SSH-Befehle doppelt zu umgehen. Meine Frage ist: Genau wo und wann wird die zweite Analyse durchgeführt?
Wenn ich Folgendes ausführe:
$ ssh otherhost pstree -a -p
Ich sehe folgendes in der Ausgabe:
|-sshd,3736
| `-sshd,1102
| `-sshd,1109
| `-pstree,1112 -a -p
Der übergeordnete Prozess für den Remote-Befehl ( pstree
) lautet sshd
: Es scheint dort keine Shell zu geben, die die Befehlszeilenargumente für den Remote-Befehl analysiert. Es scheint also nicht so, als wäre ein doppeltes Anführungszeichen oder ein Escapezeichen erforderlich ( aber es ist definitiv). Wenn ich stattdessen zuerst dort ssh und eine Login-Shell bekomme und dann starte, pstree -a -p
sehe ich Folgendes in der Ausgabe:
├─sshd,3736
│ └─sshd,3733
│ └─sshd,3735
│ └─bash,3737
│ └─pstree,4130 -a -p
Es gibt also eindeutig eine bash
Shell, die in diesem Fall das Parsen von Befehlszeilen durchführen würde. In dem Fall, in dem ich einen Remote-Befehl direkt verwende, scheint es keine Shell zu geben. Warum ist also ein doppeltes Anführungszeichen erforderlich?
Ich glaube, ich habe es herausgefunden:
Die Argumente
pstree
sind: anzeigen Befehlszeilenargumente, zeigen pids und zeigen nur übergeordnete Prozesse des gegebenen pid. Dies'$$'
ist eine spezielle Shell-Variable, die bash durch eine eigene pid ersetzt, wenn bash die Befehlszeilenargumente auswertet. Es wird einmal zitiert, um zu verhindern, dass es von meiner lokalen Shell interpretiert wird. Es wird jedoch nicht doppelt zitiert oder maskiert, damit es von der Remote-Shell interpretiert werden kann.Wie wir sehen können, wird es durch ersetzt,
12001
so dass dies die PID der Shell ist. Wir können auch aus der Ausgabepstree,12001
ersehen, dass der Prozess mit einer PID von 12001 selbst pstree ist. Alsopstree
ist die Schale?Was ich dort sammle, ist, dass
bash
es aufgerufen wird und die Befehlszeilenargumente analysiert, aber dann aufgerufen wirdexec
, um sich durch den ausgeführten Befehl zu ersetzen.Es scheint, dass dies nur bei einem einzelnen Remote-Befehl der Fall ist:
In diesem Fall fordere ich die Ausführung
pstree
von zwei Befehlen an: gefolgt vonecho
. Und wir können hier sehen, dassbash
dies tatsächlich im Prozessbaum als übergeordnetes Element von angezeigt wirdpstree
.quelle
Als Unterstützung für die anderen Antworten habe ich den Code nachgeschlagen, der Befehle auf der Fernbedienung aufruft: https://github.com/openssh/openssh-portable/blob/4f29309c4cb19bcb1774931db84cacc414f17d29/session.c#L1660 ...
... die, wie Sie sehen,
shell
mit dem ersten-c
und dem zweiten Argument bedingungslos aufruftcommand
. Zuvor wurde dieshell
Variable auf die Login-Shell des Benutzers gesetzt, wie in aufgezeichnet/etc/passwd
.command
ist ein Argument für diese Funktion und wird letztendlich auf eine Zeichenfolge gesetzt, die wörtlich von der Leitung gelesen wird (siehesession_exec_req
in derselben Datei ). Der Server interpretiert den Befehl also überhaupt nicht, aber auf der Fernbedienung wird immer eine Shell aufgerufen.Der relevante Teil der SSH-Protokollspezifikation scheint dieses Verhalten jedoch nicht zu erfordern. es heißt nur
Dies liegt wahrscheinlich daran, dass nicht alle Betriebssysteme das Konzept einer Befehlszeilen-Shell haben. Zum Beispiel wäre es für einen klassischen MacOS-SSH-Server nicht verrückt gewesen, stattdessen dem AppleScript- Interpreter "exec" -Befehlszeichenfolgen zuzuführen .
quelle