Dlaczego sshd nie używa pseudo terminala, gdy po argumentie klienta ssh następuje program interaktywny?


11

Normalny sposób połączenia z serwerem SSH to ssh username@ip_address. Ale użytkownik może chcieć uruchomić program tylko na zdalnym komputerze. Więc nazwa programu następuje po normalnym argumencie, którym jest ssh username@ip_address <program_name>. Na przykład ssh username@ip_address ls. Ten argument jest w porządku, z wyjątkiem programów interaktywnych (które również akceptują dane wejściowe użytkownika, a także zapewniają dane wyjściowe) np top. Dane wyjściowe to

Zmienna środowiskowa TERM nie jest ustawiona.

co oznacza, że ​​żaden (pseudo-) terminal nie jest podłączony między programami sshd i top. Rozwiązaniem jest dodanie argumentu w -tmiejscu, w którym teraz staje się całe polecenie ssh -t username@ip_address top.

Moje pytanie brzmi: dlaczego sshd domyślnie nie może również używać pseudo-terminala do komunikacji z programami nieinteraktywnymi, więc nie ma potrzeby dodawania -targumentu dla programów interaktywnych?


3
Krótka odpowiedź brzmi: „ponieważ zwykle nie tego chcesz”.
Celada,

Przewiduję, że twoje pytanie zostanie zmoderowane, aby zasadniczo prosić o opinię / przeszkadzać. Ale odwróćmy pytanie: dlaczego ssh powinien alokować zasoby tty, jeśli nie jest to wymagane w zdecydowanej większości przypadków? PRAWDZIWE pytanie brzmi: dlaczego alokacja wymuszona-tty nie jest opcją konfiguracji, aby można było ustawić ją jako domyślną lub specyficzną dla hosta?
Otheus

@Otheus Jest to opcja konfiguracji. Możesz ustawić RequestTTY yes(lub force) w swojej konfiguracji.
Jakuje

Er rzeczywiście. Wydaje się, że został wprowadzony w wersji 6, ale niedługo potem się pojawi. Używam tylko bardzo starych dystrybucji. :)
Otheus

6
Skąd SSH może niezawodnie wiedzieć, że program jest interaktywny? Nawet topmoże działać w trybie wsadowym.
muru

Odpowiedzi:


18

To prawda, że, jak powiedzieli inni, PTY mają pewien narzut - ale głównym powodem nieużywania PTY podczas uruchamiania polecenia zdalnego jest utrata informacji.

Zwykle po uruchomieniu polecenia zdalnie przez ssh polecenie stdouti stderrstrumienie są wysyłane do lokalnego stdouti stderr, co oznacza, że ​​możesz je przekierować / potokować osobno - na przykład:

$ 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

Ale jeśli używasz PTY, wszystkie dane wyjściowe trafiają do stdout, ponieważ PTY nie mają oddzielnych strumieni dla danych wyjściowych / błędów:

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

To dobry punkt, o którym nie wiedziałem.
Jakuje

1
@ThomasDickey: Prawie ... pytanie nie brzmi „jaki jest historyczny powód wyboru przez programistów tego domyślnego”, ale „dlaczego sshd nie może domyślnie używać pseudoterminalu” (nacisk jest mój, ale sformułowanie jest mniej więcej bezpośrednie z pytania). Różnica w zachowaniu (która
złamałaby

2
@ThomasDickey: Czy w ogóle przeczytałeś pytanie? Gdzie wspomina o opiniach deweloperów?
psmears

1
+1 wskazuje na szczególną zaletę nieużywania pty (innej niż wydajność). Nadal można argumentować, że -tpowinna to być domyślna opcja wymagana do jej wyłączenia, więc naprawdę niewielka przewaga wydajności jest dla mnie najbardziej sensowna w przypadkach, w których nie ma to znaczenia.
Peter Cordes,

7

Strona podręcznika sshopisuje to:

Gdy serwer zaakceptuje tożsamość użytkownika, serwer albo wykonuje podane polecenie w sesji nieinteraktywnej, albo, jeśli nie podano żadnego polecenia, loguje się do komputera i daje użytkownikowi normalną powłokę jako sesję interaktywną . Cała komunikacja ze zdalnym poleceniem lub powłoką będzie automatycznie szyfrowana.

Jest to cecha i prawdopodobnie spowodowana historycznymi przyczynami rshzachowania. To całkiem rozsądne. Większość poleceń naprawdę nie jest interaktywna i przydzielanie PTY nie jest darmową operacją (co było ważniejsze 20 lat temu).


Problemy z zasobami są prawdopodobne, ale komentarz na temat rshjest niejasny, ponieważ ten program nie ma odpowiedniej opcji.
Thomas Dickey,

@ThomasDickey Nigdy nie korzystałem rsh, ale z pewnością istnieje pewien wpływ, nie w opcjach, ale w zachowaniu rshi rlogin(jeśli jest polecenie, czy nie). Nie można uruchomić komendy interaktywnej (jak łotrzyk (6) lub vi (1)) przy użyciu rsh; zamiast tego użyj rlogin (1). .
Jakuje

1

Jak sshprzypuszczać, czy wywoływane polecenie jest interaktywne, czy nie?

Ten koszmar nasila się, gdy zdajesz sobie sprawę, że możesz logować się na maszynie z systemem operacyjnym innym niż Unix.

Ponieważ nie ma łatwego rozwiązania, jedna skrzynka musi być domyślna.


Nie wie Nie może wiedzieć Dlatego mamy stronę podręcznika, która opisuje zachowanie w takich sytuacjach.
Jakuje
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.