GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie werden Ssh-Remote-Befehlszeilenargumente analysiert?

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?
Linux
  1. Wie erhalte ich eine Anzahl von Dateien in einem Verzeichnis über die Befehlszeile?

  2. Wie übergibt man ein Befehlszeilenargument an ein Shell-Skript?

  3. Wie beendet man die Chromium-Befehlszeile über SSH?

  4. So verbinden Sie einen Remote-Host mit dem ssh-Befehl

  5. So verwenden Sie Befehlszeilen-Shell-Funktionen in Linux

Was ist ein SSH-Befehl und wie wird SSH verwendet, um eine Verbindung zum Remote-Server herzustellen?

Wie führe ich einen Befehl in einem Shell-Skript aus?

Wie liest man Befehlszeilenargumente in Shell-Skripten?

Gewusst wie:FreeBSD-Fernverwaltung

So führen Sie den ssh-Befehl einen sudo-Befehl ohne Passwort aus der Ferne aus

SSH - So fügen Sie den Befehl -t in die Datei ~/.ssh/config ein