Як я можу переключатися між ttys без використання екрана?


17

Тож скажімо, ви завантажуєте інсталяцію Linux повністю до робочого столу. Ви запускаєте gnome-terminal / konsole / що завгодно, так що у вас є tty для введення команд.

Тепер скажімо, що я SSH в ту саму машину. Це прив'яже мене до іншої TTY для введення команд.

Тепер скажімо, що я хочу "переключити" свій tty з мого оригінального SSH на gnome-термінальний, розпочатий раніше.

В основному я запитую, чи є якийсь спосіб зробити те ж саме screen -x, але без екрана?

Я знаю, що ви можете легко надіслати висновок іншим tty, просто повторивши щось у файл / dev, але я не знаю способу "переглянути" те, що знаходиться в tty.

Будь-які ідеї?



Відповіді:


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 з процесами, приєднаними до іншого терміналу. Це можна зробити лише через процес, який керує цим терміналом, якщо трапляється псевдотермінал, і якщо цей процес був задуманий зробити це (як, наприклад, екран).


Це чудове пояснення! Я думаю, що це насправді не відповідь, але це питання добре підійде . Одне зауваження: "немає способу" справедливо лише в тому випадку, якщо ви забороняєте ptrace; завдяки ptrace, програмою подобається neercs, rettyі так далі може зробити це іноді.
Жил 'SO- перестань бути злим'

@Gilles: добре вони роблять щось інше: вони змінюють значення дескрипторів файлів ( stdin, stdoutправоруч від схеми) безпосередньо шляхом викрадення процесу. Чисте зло!
Стефан Гіменез

1
Хм, ти маєш рацію, вони змінюють іншу стрілку. Зло, але зручно!
Жил "ТАК - перестань бути злим"

8

Повторне підключення процесів на іншому терміналі до поточного терміналу неможливо без брудних хитрощів. Це можливо, примушуючи процес виконувати певні системні дзвінки (з ptrace); це спричиняє збій деяких програм. Є кілька інструментів , які роблять це, наприклад neercs, retty, cryopid, reptyr, ...; див. Як я можу відмовитись від запущеного процесу та пов’язати його з новою оболонкою екрана? і пов'язані питання.

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

Проста відповідь полягає в тому, що якщо ви хочете знову підключитися до терміналу з іншого місця, використовуйте screenабо tmux.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.