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

proc и sys файловые системы обеспечиваются рабочим ядром - когда ядро не работает, они прекращают существование. Это означает это, когда Вы chroot в другую операционную систему, эти файловые системы не присутствуют. Много программ ожидают, что они будут существовать так, чтобы они могли функционировать, например, они могут запросить информацию о рабочей системе или хотеть изменить способ, которым ядро обрабатывает что-то. Это достаточно часто просто для обеспечения /proc и /sys от текущего ядра для этих программ для работы как ожидалось.

Символьная ссылка не была бы достаточна, поскольку действие chrooting будет делать недействительным используемые пути к файлам. В Linux Вы также не можете каталоги жесткой ссылки (кроме . и .., в соответствии с mkdir). Это означает, что третья опция должна использоваться для зеркального отражения этих файловых систем к chrooted среде - связывают монтирование. Связывание монтирования обеспечивается ядром непосредственно и работает как ожидалось в chroot.

5
14.06.2015, 16:25
3 ответа

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

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

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

     экран 
     
  4. Присоединиться к тому же сеансу экрана из другого Терминал.

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

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

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

3
27.01.2020, 20:36

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

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

Например:

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

Я только что выполнил (в основном) указанную выше команду со своего планшетного терминала Android после переключения с X на vt2 с помощью CTRL + ALT + F2 на моем настольном компьютере для перехода к новой подсказке входа в систему . Терминал Android запрашивал у меня мой пароль обычным способом, а затем я находился в своей оболочке на планшете и все, что было записано в терминал моего планшета (подсказки, мой ввод, cat файл и т. Д.) также отображался на моем рабочем столе. Каждая клавиша, которую я набирал (или касался, или что-то еще) на планшете, мгновенно передавался на рабочий стол 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 

... как видите, это файл устройства, принадлежащий root, но он относится к группе tty .

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

2
27.01.2020, 20:36

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

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

[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+AD, чтобы отсоединиться от сеанса.

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

3
27.01.2020, 20:36

Теги

Похожие вопросы