Почему 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 ресурсы, когда это не требуется в подавляющем большинстве случаев? НАСТОЯЩИЙ вопрос: почему принудительное распределение не является параметром конфигурации, чтобы вы могли сделать его по умолчанию или специфичным для хоста по умолчанию?
Отей
@Otheus Это является вариантом конфигурации. Вы можете установить RequestTTY yes(или force) в вашей конфигурации.
Jakuje
Э-э, действительно. Кажется, было введено в 6, но глючит до вскоре после. Я использую только очень старые дистрибутивы. :)
Otheus
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
$
psmears
источник
Это хороший момент, о котором я не знал.
Jakuje
1
@ThomasDickey: Вряд ли ... вопрос не в том, "что является исторической причиной выбора разработчиков по умолчанию", а в том, почему sshd не может использовать псевдо-терминал по умолчанию (акцент мой, но формулировка более или менее прямая от вопроса). Таким образом, разница в поведении (которая может нарушить ряд скриптовых идиом) актуальна, независимо от того, как разработчики сделали такой выбор :-)
psmears
2
@ThomasDickey: Ты вообще читал вопрос? Где это упоминает мнение разработчиков?
psmears
1
+1 указывает на конкретное преимущество не использования pty (кроме производительности). Вы все еще можете утверждать, что это -tдолжно быть значение по умолчанию, и опция, необходимая для его отключения, так что на самом деле незначительное преимущество в производительности - это то, что имеет для меня наибольшее значение в тех случаях, когда это не имеет значения.
Питер Кордес
7

Страница руководства для sshописывает это:

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

Это особенность и, вероятно, вызвано историческими причинами rshповедения. Это довольно разумно. Большинство команд на самом деле не являются интерактивными, и это не бесплатная операция для выделения PTY (что было более важным 20 лет назад).

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

Как sshпредположить, является ли команда, которую вы вызываете, интерактивной или нет?

Этот кошмар усугубляется, когда вы понимаете, что можете войти в систему с операционной системой, отличной от Unix.

Поскольку не было простого решения, один случай должен был быть по умолчанию.

dmckee --- котенок экс-модератора
источник
Не знает. Это не может знать. И поэтому у нас есть справочная страница, которая описывает поведение в этих ситуациях.
Jakuje