Для удаленной SSH-команды требуется терминал

3

Итак, для одного из моих серверов большая часть того, что я делаю, это файлы редактирования с помощью vim. Можно ли сделать что-то вроде ssh me@myserver vim ? Когда я пытаюсь это сделать, я получаю сообщение «Warning, output is not to terminal», а vim неприменим.

Я прочитал man-страницу ssh, но bash не нравится escape-символ ~ C для создания командного терминала.     

задан Ray Vinmad 04.01.2016 в 10:34
источник

1 ответ

5

Теория

Сессии SSH можно запускать с - или без - удаленным сервером, распределяющим псевдотерминал (PTY).

Обычно, когда вы подключаетесь к удаленному хосту через SSH (без указания команды), вы запускаете свою оболочку входа по умолчанию после правильной проверки подлинности. При запуске этой оболочки на удаленном узле псевдотерминал автоматически выделяется для интерактивной оболочки. Это позволяет оболочке писать на экран пользователя, чтобы он мог делать такие вещи, как отображение приглашения.

Во время интерактивного сеанса переменная окружения SSH_TTY устанавливается на узел устройства удаленного устройства PTY, например /dev/pts/10 , а при выходе из псевдотерминала ssh выводит следующее сообщение:

Connection to <remotehost> closed.

Для неинтерактивных сеансов SSH, т. е. указания команды для запуска на удаленном хосте, не назначается псевдотерминал, а вывод команды отправляется в stdout локального терминала , Это поведение по умолчанию хорошо работает при запуске команд, которые просто читают входные данные из stdin и печатаются в stdout и / или stderr , например, ls , ps и т. Д. В этом случае переменная среды SSH_TTY не задано, и я также заметил, что переменная среды TERM установлена ​​на dumb . При работе без псевдотерминала escape-символы, такие как ~C , не поддерживаются; это делает его безопасным для программ для передачи двоичных файлов, которые могут содержать эти последовательности.

Однако, такие программы, как vim или top , должны иметь возможность перерисовывать экран с использованием различных возможностей терминала (обычно используя библиотеку ncurses ). Для этого им требуется терминальное устройство - или устройство, которое эмулирует терминал. Клиент ssh имеет параметр -t , который заставляет выделять псевдотерминал. Эта опция -t описана на странице управления SSH:

  

Принудительное распределение псевдо-tty. Это может быть использовано для выполнения произвольных программ на основе экрана на удаленной машине, что может быть очень полезно, например. при реализации услуг меню. Множество опций -t принудительно назначают tty, даже если ssh не имеет локального tty.

Заключение

Итак, добавление опции -t в вашу команду SSH - это все, что вам нужно сделать, чтобы предоставить Vim терминальное устройство, которое оно может использовать:

ssh -t me@myserver vim
    
ответ дан Anthony Geoghegan 04.01.2016 в 11:06
источник