Как отображать команды в другом терминале?

У меня есть малина pi с прикрепленным к ней экраном. Он загружается до приглашения для входа. У меня нет клавиатуры, и никакая мышь не привязана к ней и хотела бы сохранить ее таким образом. Я перехожу к нему через ssh из сети, но хотел бы видеть команды, которые я вводил через ssh и их вывод на подключенном экране. Возможно ли это?

Я не уверен, может ли быть более «прямое» решение, включающее только перенаправление входов и выходов, но мне удалось сделать что-то вроде этой работы, используя экран . Идея состоит в том, чтобы делать всю вашу работу внутри сеанса screen и дважды присоединяться к сеансу, один раз с вашего рабочего SSH-терминала и один раз с прикрепленного экрана.

Во-первых, вам нужно будет узнать название терминала для подключенного дисплея. У меня нет rPI для тестирования, но я предполагаю, что экран с прямым подключением отображается на обычную консоль Linux, поэтому, вероятно, это будет /dev/tty1 .

  1. Убедитесь, что установлен screen
  2. Войти через SSH
  3. Создать новый сеанс экрана

     screen 
  4. Прикрепите к тому же сеансу экрана с другого терминала.

    Способ использования этой функции заключается в том, что вы должны войти в систему, используя локальную клавиатуру и screen -r -x типа screen -r -x (для сеанса возобновления -r и -x multi-attach для существующего сеанса), но в этом случае вы не можете использовать ' t фактически вошел в систему на терминал, с которого вы хотите подключиться к сеансу. Поэтому мы перенаправляем ввод и вывод на предполагаемый терминал, чтобы «убедить» экран, который является терминалом, из которого мы хотим подключиться. Это хаки, но это сработало для меня.

     screen -r -x </dev/tty1 >/dev/tty1 2>&1 & disown 

Если имя терминала для видеоконференции rPI не является /dev/tty1 а что-то еще, вы можете узнать, что это такое, подключив клавиатуру только один раз и выполнив локальную регистрацию и набрав tty в tty строке.

Интересно, я также думал о screen -x или tmux attach как решение Celada, но я бы предпочел настроить init (в /etc/inittab или /etc/init или /etc/systemd ) или супервизор для автоматического запуска getty-on- сеанс экрана при загрузке.

Рабочая конфигурация для супервизора:

 [program:screen] command=bash -c 'chvt 9 && TERM=linux exec screen getty tty </dev/tty9 >/dev/tty9 2>&1' autostart=true autorestart=true 

Он автоматически переключается на /dev/tty9 и запускает экран с запуском getty для отображения приглашения на вход. Из других сеансов ssh вы можете запустить sudo screen -x для присоединения к этой консоли, затем наберите Ctrl + A D, чтобы отсоединиться от сеанса.

Для присоединения сеанса экрана вам нужна привилегия root, потому что она запускается root. Возможно, вы захотите включить многопользовательский режим экрана, но ему нужно установить setuid на /usr/bin/screen что вызывает некоторые проблемы безопасности. Подробнее см. В руководстве по экрану .

Если у вас установлен xterm на pi он должен был включить приложение luit terminal UTF-8 – это небольшая программа, которая часто используется для перевода на другие типы терминальных приложений, которые не поддерживают UTF-8. luit работает, выделяя псевдотерминал – во многом screen работает, но с намного меньшими накладными расходами.

Одна вещь, luit может легко сделать, – это копировать вход (или вывод – который может быть другим) к определенному файлу по мере его поступления. В то время как (в качестве ведущего устройства терминала) входной сигнал означает весь вывод сеанса терминала (даже, возможно, включая собственный собственный stty echo выход), а вывод означает все, что он будет записывать в терминальное устройство после обработки всего вывода из сеанса терминала. Он делает это, одновременно копируя свой stdin (который должен поступать из терминала – и, следовательно, ваша клавиатура), в программу, которую он обертывает – например, оболочку. Я знаю, что pty i / o может быть немного странным, но, судя по всему, он может создать удобное средство для дублирования вывода терминального сеанса на несколько устройств отображения в реальном времени.

Например:

 ssh me@machine -t 'luit -olog /dev/tty2 sh' 

Я только что выполнил (в основном) приведенную выше команду с моего терминала Android Android после переключения из X в vt2 с помощью CTRL + ALT + F2 на моем настольном компьютере в новое приглашение для login . Терминал android запросил меня для моего пароля обычным способом, а затем я был в своей оболочке на планшете, и все, что было написано на терминале моего планшета (подсказки, мой ввод, cat file и т. Д.), Также отображалось на моем рабочем столе. Каждый ключ, который я набрал (или коснулся или что-то еще) на планшете, мгновенно отозвался на рабочий стол vt2.

Для этого, если ваш процесс нереста tty (как правило, getty или аналогичный) создает терминальные устройства с некоторым уровнем разрешений, которые ваша учетная запись пользователя не может выполнить по умолчанию, вам нужно будет это изменить. Это может быть просто:

 chown me /dev/tty[num] 

… если вы этого хотите. В моей системе моя учетная запись пользователя является членом группы tty – и поэтому это не проблема. Я полагаю, что для большинства дистрибутивов Linux необходимо добавить учетную запись пользователя в группе tty , чтобы она просто работала.

 ls -l /dev/tty2 crw--w---- 1 root tty 4, 2 Jun 14 05:14 /dev/tty2 

… как вы можете видеть, это файл с корневым файлом, но назначается группе tty .

В любом случае выполнение вышеприведенной команды luit может быть всем, что вам когда-либо понадобится. Более сложные – и, возможно, желательные – решения могут иметь w / screen , tmux и др., Но если все, что вы хотите сделать, это увидеть вывод на каком-то другом устройстве, тогда обычно все, что вам нужно сделать, это написать ему.