Чому sshd не використовує псевдотермінал, коли за аргументом ssh-клієнта йде інтерактивна програма?


11

Нормальним способом підключення до SSH-сервера є ssh username@ip_address. Але користувач може захотіти запустити програму лише на віддаленій машині. Отже, назва програми слідує після звичайного аргументу, який є ssh username@ip_address <program_name>. Наприклад, ssh username@ip_address ls. Цей аргумент чудовий, за винятком інтерактивних програм (які також приймають введення користувачів, а також надають вихід), наприклад top. Вихід є

Змінна середовища TERM не встановлена.

а це означає, що жоден (псевдо-) термінал не приєднаний між програмами sshd та top. Рішення полягає в тому, щоб додати аргумент -tтам, де тепер стає вся команда ssh -t username@ip_address top.

Моє запитання: чому за замовчуванням sshd не може також використовувати псевдотермінал для спілкування з неінтерактивними програмами, тому немає необхідності додавати -tаргументи для інтерактивних програм?


3
Коротка відповідь - «тому що зазвичай це не те, що ти хочеш».
Селада

Я прогнозую, що ваше запитання буде модеровано для того, щоб по суті просити думку / висловлюватися. Але давайте розгорнемо питання: навіщо ssh виділяти tty ресурси, коли це не потрібно в переважній більшості випадків? Справжнє запитання: чому не призначається присвоєння силою tty параметра налаштування, щоб ви могли зробити його типовим або специфічним для хоста типом?
Отей

@Otheus Це є варіантом конфігурації. Ви можете встановити RequestTTY yes(або force) у своєму конфігурації.
Jakuje

Дійсно. Здається, було введено в 6, але баггі до незабару. Я використовую лише дуже старі дистрибутиви. :)
Отей

6
Як SSH може надійно знати, що програма є інтерактивною? Навіть topможе працювати в пакетному режимі.
муру

Відповіді:


18

Це правда, що, як говорили інші, PTY мають певні накладні витрати, але головною причиною не використовувати PTY під час виконання віддаленої команди є те, що ви втрачаєте інформацію.

Зазвичай, коли ви запускаєте команду віддалено через ssh, команда stdoutта stderrпотоки надсилаються до локальних, stdoutа stderrце означає, що ви можете перенаправляти / передавати їх окремо - наприклад:

$ 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

Але якщо ви використовуєте PTY, весь вихід надходить stdout, оскільки у PTY немає окремих потоків для виводу / помилки:

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

Це хороший момент, про який я не знав.
Jakuje

1
@ThomasDickey: Навряд чи ... питання полягає не в тому, "що є історичною причиною вибору розробниками цього за замовчуванням", а "чому sshd не може використовувати псевдотермінал за замовчуванням" (акцент мій, але формулювання більш-менш пряме від питання). Тож різниця в поведінці (яка б
порушила

2
@ThomasDickey: Ви навіть читали запитання? Де згадується думка розробників?
psmears

1
+1 вказує на конкретну перевагу не використовувати pty (крім продуктивності). Ви все ще можете стверджувати, що це -tмає бути типовим і потрібним варіантом, щоб його вимкнути, тому дійсно незначна перевага в продуктивності - це те, що має найбільше сенс для мене у випадках, коли це не має значення.
Пітер Кордес

7

Сторінка посібника для sshопису цього:

Коли ідентифікатор користувача був прийнятий сервером, сервер або виконує задану команду в неінтерактивному сеансі, або, якщо жодна команда не була визначена, входить в машину і надає користувачеві звичайну оболонку як інтерактивний сеанс . Вся комунікація з віддаленою командою або оболонкою буде автоматично зашифрована.

Це особливість і, ймовірно, викликана історичними причинами rshповедінки. Це досить розумно. Більшість команд насправді не є інтерактивними, і це не вільна операція з виділення PTY (що було важливішим 20 років тому).


Проблеми з ресурсом правдоподібні, але коментар щодо цього rshє неясним, оскільки для цієї програми немає відповідного варіанту.
Томас Дікі

@ThomasDickey я ніколи не використовував rsh, але, безумовно, є якийсь вплив, не в параметрах, а в поведінці rshі rlogin(якщо є команда чи ні). Ви не можете запустити інтерактивну команду (наприклад, rogue (6) або vi (1)), використовуючи rsh; використовуйте замість нього rlogin (1). .
Jakuje

1

Як sshприпустити, чи є команда, яку ви викликаєте, інтерактивна чи ні?

Цей кошмар стає ще гіршим, коли ви усвідомлюєте, що можете ввійти в машину, на якій працює операційна система UNIX.

Не маючи простого рішення, за замовчуванням повинен був бути один випадок.


Це не знає. Це не може знати. Тому ми маємо сторінку керівництва, яка описує поведінку в цих ситуаціях.
Jakuje
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.