Warum verwendet sshd kein Pseudo-Terminal, wenn auf das Argument des ssh-Clients ein interaktives Programm folgt?

11

Die normale Art, eine Verbindung zu einem SSH-Server herzustellen, ist ssh username@ip_address. Ein Benutzer möchte jedoch möglicherweise nur ein Programm auf dem Remotecomputer ausführen. Der Programmname folgt also nach dem normalen Argument ssh username@ip_address <program_name>. Zum Beispiel ssh username@ip_address ls. Dieses Argument ist in Ordnung, mit Ausnahme interaktiver Programme (die auch Benutzereingaben akzeptieren und Ausgaben bereitstellen), z top. Die Ausgabe ist

TERM-Umgebungsvariable nicht festgelegt.

Dies bedeutet, dass kein (Pseudo-) Terminal zwischen dem sshd- und dem top-Programm angeschlossen ist. Die Lösung besteht darin, ein Argument hinzuzufügen, -tbei dem der gesamte Befehl jetzt wird ssh -t username@ip_address top.

Meine Frage ist, warum sshd nicht standardmäßig auch ein Pseudo-Terminal für die Kommunikation mit nicht interaktiven Programmen verwenden kann, sodass das -tArgument für interaktive Programme nicht hinzugefügt werden muss.

Ron Vince
quelle
3
Die kurze Antwort lautet "weil Sie das normalerweise nicht wollen".
Celada
Ich gehe davon aus, dass Ihre Frage moderiert wird, wenn Sie im Wesentlichen um eine Meinung bitten / sich beschweren. Aber lassen Sie uns die Frage umdrehen: Warum sollte ssh tty-Ressourcen zuweisen, wenn dies in den allermeisten Fällen nicht erforderlich ist? Die WIRKLICHE Frage lautet: Warum ist die Force-Tty-Zuweisung keine Konfigurationsoption, sodass Sie sie als Standard- oder hostspezifischen Standard festlegen können?
Otheus
@Otheus Es ist Konfigurationsoption. Sie können in Ihrer Konfiguration festlegen RequestTTY yes(oder force).
Jakuje
Ähm in der Tat. Scheint in 6 eingeführt worden zu sein, aber bis kurz danach fehlerhaft. Ich benutze nur sehr alte Distributionen. :)
Otheus
6
Wie kann SSH zuverlässig wissen, dass ein Programm interaktiv ist? Auch topkann im Batch - Modus ausgeführt werden .
Muru

Antworten:

18

Es ist wahr, dass PTYs, wie andere gesagt haben, einen gewissen Overhead haben - aber der Hauptgrund dafür, dass Sie beim Ausführen eines Remote-Befehls kein PTY verwenden, ist, dass Sie Informationen verlieren.

Wenn Sie einen Befehl remote über ssh ausführen, werden die Befehle stdoutund stderrStreams normalerweise an das lokale stdoutund gesendet. Dies stderrbedeutet, dass Sie sie separat umleiten / weiterleiten können - zum Beispiel:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

Wenn Sie jedoch einen PTY verwenden, wird die gesamte Ausgabe an stdoutgesendet, da PTYs keine separaten Streams für Ausgabe / Fehler haben:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$
psmears
quelle
Dies ist ein guter Punkt, den ich nicht kannte.
Jakuje
1
@ThomasDickey: Kaum ... die Frage ist nicht "was ist der historische Grund für die Wahl dieser Standardeinstellung durch die Entwickler", sondern "warum kann sshd nicht standardmäßig ein Pseudo-Terminal verwenden" (der Schwerpunkt liegt bei mir, aber der Der Wortlaut ergibt sich mehr oder weniger direkt aus der Frage. Der Unterschied im Verhalten (der eine Reihe von Skriptsprachen brechen würde) ist also relevant, unabhängig davon, wie die Entwickler diese Wahl getroffen haben :-)
psmears
2
@ThomasDickey: Hast du die Frage überhaupt gelesen ? Wo wird die Meinung der Entwickler erwähnt?
psmears
1
+1 weist auf einen besonderen Vorteil hin , wenn kein Pty verwendet wird (außer Leistung). Sie könnten immer noch argumentieren, dass -tdies die Standardeinstellung sein sollte und eine Option zum Deaktivieren erforderlich ist. Daher ist der geringfügige Leistungsvorteil für mich in Fällen, in denen dies keine Rolle spielt, am sinnvollsten.
Peter Cordes
7

Handbuchseite für sshbeschreibt dies:

Wenn die Identität des Benutzers vom Server akzeptiert wurde, führt der Server den angegebenen Befehl entweder in einer nicht interaktiven Sitzung aus oder meldet sich , wenn kein Befehl angegeben wurde, am Computer an und gibt dem Benutzer eine normale Shell als interaktive Sitzung . Die gesamte Kommunikation mit dem Remote-Befehl oder der Shell wird automatisch verschlüsselt.

Es ist ein Merkmal und wird wahrscheinlich durch historische rshVerhaltensgründe verursacht. Es ist ziemlich vernünftig. Die meisten Befehle sind wirklich nicht interaktiv und es ist kein freier Betrieb, PTY zuzuweisen (was vor 20 Jahren wichtiger war).

Jakuje
quelle
Ressourcenprobleme sind plausibel, aber der Kommentar zu rshist unklar, da dieses Programm keine entsprechende Option hat.
Thomas Dickey
@ThomasDickey habe ich nie benutzt rsh, aber es gibt sicherlich einen gewissen Einfluss, nicht auf die Optionen, sondern auf das Verhalten von rshund rlogin(ob es einen Befehl gibt oder nicht). Sie können keinen interaktiven Befehl (wie rogue (6) oder vi (1)) mit rsh ausführen. Verwenden Sie stattdessen rlogin (1). .
Jakuje
1

Wie soll sshfestgestellt werden, ob der von Ihnen aufgerufene Befehl interaktiv ist oder nicht?

Dieser Albtraum wird noch schlimmer, wenn Sie feststellen, dass Sie sich möglicherweise bei einem Computer anmelden, auf dem ein Nicht-Unix-Betriebssystem ausgeführt wird.

Da es keine einfache Lösung gab, musste ein Fall der Standard sein.

dmckee --- Ex-Moderator Kätzchen
quelle
Es weiß es nicht. Es kann nicht wissen. Und deshalb haben wir eine Handbuchseite, die das Verhalten in diesen Situationen beschreibt.
Jakuje