Was ist das Prinzip hinter OpenSSH-Subsystemen (oder Befehl = Option)?

3933
0xC0000022L

In OpenSSH kann man ein Subsystem in der Konfigurationsdatei ( /etc/ssh/sshd_config) deklarieren ( ) oder einen Befehl erzwingen svnserve, der ausgeführt wird, indem er dies in die authorized_keysZeile für einen bestimmten Schlüssel wie folgt einfügt:

command="svnserve -t --tunnel-user=alice" ssh-dss AAAA... command="svnserve -t --tunnel-user=bob" ssh-dss AAAA... 

Dadurch kann derselbe Systembenutzer für verschiedene "Identitäten" innerhalb des Subversion ( svnserve) - Kontexts wiederverwendet werden .

Wie schreibe svnserveich einen Dienst wie ich, der die Verwendung des Tunnels angibt, und wie genau werden die Daten in diesen Fällen übertragen? Wie svnserve"weiß" die Instanz insbesondere, auf welche Weise die Daten ausgegeben oder Eingaben gelesen werden sollen? Geschieht dies alles über stdoutund stdinin einem solchen Fall, und wenn ja, gibt es auch eine Möglichkeit, sich zu unterscheiden stderr?

Ich kann mir vorstellen, dass das Subsystem und command=derselbe Mechanismus verwenden, aber korrigieren Sie mich bitte, wenn ich falsch liege.

(Ich habe no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-ptydie Kürze weggelassen, aber ich bin mir ihrer und ihres Einsatzes für das Szenario bewusst.)

3

1 Antwort auf die Frage

4
grawity

Beachten Sie zunächst, dass command=kein SSH-Subsystem aufgerufen wird. Es führt den Befehl lediglich so aus, als wäre er in der Befehlszeile des SSH-Clients angegeben. z.B

ssh yourhost "svnserve -t --tunnel-user=alice"  ssh yourhost "git upload-pack /pub/git/myproject.git"  ssh yourhost "ls -la" 

Die obigen Beispiele sollten deutlich machen, dass die Kommunikation mit svnserveoder gitoder lsüber dasselbe stdio (stdin / stdout / stderr) erfolgt wie jede andere SSH-Interaktion. Bei SVN und Git sshdient der Client lediglich als Werkzeug zum Remote-Aufrufen von Befehlen.


"Echte" Subsysteme, wie sie mit der SubsystemOption in konfiguriert wurden sshd_config, unterscheiden sich nicht sehr. Der einzige wesentliche Unterschied besteht darin, dass sie mit einem statischen, bekannten Namen aufgerufen werden können, anstatt sich auf die Remote-Login-Shell (bash, zsh, & c) zu verlassen, um die richtige ausführbare Datei zu finden. Zum Beispiel kann sich der SFTP-Server /usr/lib/ssh/sftp-serverauf einem Computer befinden, MULTINET_COMMON_ROOT:[MULTINET]SFTP-SERVER2.EXEauf einem anderen, der in einen sshddritten Computer ( Subsystem sftp internal-sftp ) integriert ist. In allen Fällen können Clients ihn jedoch weiterhin anhand des Namens finden sftp.

Zumindest in OpenSSH können Subsysteme wie normale Programme geschrieben werden, die über stdin / stdout / stderr mit dem Client kommunizieren. Es scheint jedoch, dass das Übergeben von beliebigen Befehlszeilenargumenten nicht zulässig ist. Sie können also nicht einfach ein einzelnes svnserveSubsystem für alle Benutzer konfigurieren .

Gute Antwort. Vielen Dank. Ich bin mir bewusst, dass die Subsysteme unterschiedlich sind, aber sie sind mit der `command =` -Methode verwandt, also rechnete ich damit, dass die Kommunikationsmethode dieselbe ist. 0xC0000022L vor 11 Jahren 0