Ich habe die Fragen und Antworten zur Notwendigkeit gesehen, die Argumente für Remote-SSH-Befehle doppelt zu maskieren. Meine Frage ist:Wo genau und wann wird das zweite Parsing durchgeführt?
Wenn ich Folgendes ausführe:
$ ssh otherhost pstree -a -p
In der Ausgabe sehe ich Folgendes:
|-sshd,3736
| `-sshd,1102
| `-sshd,1109
| `-pstree,1112 -a -p
Der übergeordnete Prozess für den Remote-Befehl (pstree
) ist sshd
, scheint es dort keine Shell zu geben, die die Befehlszeilenargumente für den Remote-Befehl parsen würde, also scheint es nicht so, als ob doppelte Anführungszeichen oder Escapezeichen erforderlich wären (aber das ist es definitiv). Wenn ich stattdessen zuerst dorthin ssh und eine Login-Shell erhalte und dann pstree -a -p
ausführe In der Ausgabe sehe ich Folgendes:
├─sshd,3736
│ └─sshd,3733
│ └─sshd,3735
│ └─bash,3737
│ └─pstree,4130 -a -p
Es gibt also eindeutig eine bash
Shell dort, die in diesem Fall die Befehlszeilenanalyse durchführen würde. Aber wenn ich einen Remote-Befehl direkt verwende, scheint es keine Shell zu geben, warum sind also doppelte Anführungszeichen erforderlich?
Akzeptierte Antwort:
Es gibt immer eine Remote-Shell. Beim SSH-Protokoll sendet der Client dem Server eine Zeichenfolge zur Ausführung. Der SSH-Befehlszeilenclient nimmt seine Befehlszeilenargumente und verkettet sie mit einem Leerzeichen zwischen den Argumenten. Der Server nimmt diese Zeichenfolge, führt die Anmelde-Shell des Benutzers aus und übergibt ihr diese Zeichenfolge. (Genauer:Der Server führt das Programm aus, das als Shell des Benutzers in der Benutzerdatenbank registriert ist, und übergibt ihm zwei Befehlszeilenargumente:-c
und die vom Client gesendete Zeichenfolge. Die Shell wird nicht als Login-Shell aufgerufen:Der Server setzt das nullte Argument nicht auf eine Zeichenkette, die mit -
beginnt .)
Es ist unmöglich, die Remote-Shell zu umgehen. Das Protokoll hat nichts mit dem Senden eines Arrays von Zeichenfolgen zu tun, die als argv-Array auf dem Server geparst werden könnten. Und der SSH-Server wird die Remote-Shell nicht umgehen, da dies eine Sicherheitsbeschränkung sein könnte:Die Verwendung eines eingeschränkten Programms als Shell des Benutzers ist eine Möglichkeit, ein eingeschränktes Konto bereitzustellen, das nur bestimmte Befehle ausführen darf (z ein Nur-Git-Konto).
Möglicherweise sehen Sie die Shell nicht in pstree
weil es vielleicht schon weg ist. Viele Shells haben eine Optimierung, bei der die Shell „execve
“ ausführt, wenn sie erkennen, dass sie im Begriff sind, „diesen externen Befehl auszuführen, auf dessen Abschluss zu warten und mit dem Status des Befehls zu beenden“. dieses externen Befehls“ statt. Dies ist, was in Ihrem ersten Beispiel passiert. Vergleichen Sie die folgenden drei Befehle:
ssh otherhost pstree -a -p
ssh otherhost 'pstree -a -p'
ssh otherhost 'pstree -a -p; true'
Die ersten beiden sind identisch:Der Client sendet genau die gleichen Daten an den Server. Der dritte sendet einen Shell-Befehl, der die Exec-Optimierung der Shell zunichte macht.
Verwandte:Was ist der Unterschied zwischen Spinlocks und Semaphoren?