Как я могу переключаться между ttys без использования экрана?

17

Допустим, вы загрузили установку Linux до самого рабочего стола. Вы запускаете gnome-терминал / консоль / что угодно, поэтому у вас есть tty для ввода команд.

Теперь, скажем, я SSH в той же машине. Это свяжет меня с другим tty для ввода команд.

Теперь допустим, что я хочу «переключить» мой tty с моего исходного SSH на gnome-терминал, запущенный ранее.

В основном я спрашиваю, есть ли способ сделать то же самое screen -x, но без экрана?

Я знаю, что вы легко можете отправить вывод другому tty, просто вставив что-то в файл / dev, но я не знаю способа «просмотреть», что находится в tty.

Есть идеи?

user488244
источник

Ответы:

16

Возможно, эти схемы могут прояснить ситуацию. Это обычная настройка:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

И нет никакого способа подключить что-то новое Process3:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

Что делает экран (и другие), так это выделяет какое-то псевдотерминальное устройство (как это делает xterm) и перенаправляет его на один или несколько «реальных» терминалов (физических, виртуальных или эмулируемых):

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

Используя screen -xвы можете прикрепить еще один терминал, xterm, что угодно (скажем Terminal 3) к экранной сессии.

Так что нет, вы не можете напрямую общаться через stdin / stdout с процессами, подключенными к другому терминалу. Вы можете сделать это только через процесс, который управляет этим терминалом, если он окажется псевдотерминалом, и если этот процесс был завершен (например, screen).

Стефан Хименес
источник
Это отличное объяснение! Я думаю, что это не совсем ответ здесь, но подойдет этот вопрос хорошо. Одно наблюдение: «нет пути» верно только в том случае, если вы запрещаете ptrace; благодаря ptrace, такие программы, как neercs, rettyи так далее, могут делать это иногда.
Жиль "ТАК - перестать быть злым"
@Gilles: хорошо они делают что - то другое: они меняют значение файловых дескрипторов ( stdin, stdoutв правой части схемы) непосредственно угон процесса. Чистое зло!
Стефан Гименес
1
Хм, вы правы, они меняют другую стрелу. Зло, но удобно!
Жиль "ТАК - перестань быть злым"
8

Повторное подключение процессов на другом терминале к текущему терминалу невозможно без грязных уловок. Это возможно, заставляя процесс выполнять определенные системные вызовы (с ptrace); это вызывает сбой некоторых программ. Есть несколько инструментов , которые делают это, например neercs, retty, cryopid, reptyr, ...; см. Как я могу отречься от запущенного процесса и связать его с новой оболочкой экрана? и связанные вопросы.

Получение вывода, уже отображенного на другом терминале, является другой проблемой. Не существует полностью общего решения: в принципе, после вывода вывода терминал может сохранить его только в виде изображения. На практике все эмуляторы X-терминала сохраняют свой выходной буфер в текстовой форме, чтобы вы могли скопировать и вставить его. Способ получения этого вывода зависит от эмулятора терминала; Основная идея состоит в том, чтобы смоделировать выбор всего буфера прокрутки. Для консоли Linux, такой как /dev/tty1, буфер прокрутки легко доступен как /dev/vcs1/dev/vcsa1с текстовыми атрибутами).

Ответ прост: если вы хотите подключиться к терминалу из другого места, используйте screenили tmux.

Жиль "ТАК - прекрати быть злым"
источник