Як я можу підключитися до виходу одного терміналу з іншого терміналу?


45

Мені потрібно підключитися до виходу поточного запущеного терміналу (tty1) з віртуального терміналу і захопити його (запуск X-сервера).


5
Хоча я розумію, що іноді виникає потреба у захопленні вмісту на іншому tty після запуску команди, унція профілактики коштує фунта вилікування, тому завжди варто задуматися про початок використання screenабо tmuxперед запуском команди, до якої, можливо, ви хочете отримати доступ з іншого терміналу .
декап

І коли ви можете підготувати його раніше, можливо, також tmate буде приємним кандидатом, який працює навіть в Інтернеті, а не лише в локальному. (і має необов'язковий доступ для запису)
rugk

Відповіді:


23

Я натрапив на цей один інструмент під назвою ttylog. Це програма Perl, доступна на CPAN тут . У ньому є декілька застережень, одне з яких, я можу лише зрозуміти, як приєднатись до терміналу, який був створений як частина того, хто хтось сшиває в мій ящик. Інша справа, що вам доведеться запускати його з підвищеними привілеями (наприклад, root або sudo).

Але це працює!

Наприклад

Спочатку ssh у свій ящик через термін №1:

TERM#1% ssh saml@grinchy

Зверніть увагу на цей новий термінал:

TERM#1% tty
/dev/pts/3

Тепер в іншому терміналі (TERM # 2) запустіть цю команду:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

Тепер поверніться до TERM №1 та введіть речі, вони з’являться у TERM №2.

ss терміналів

Усі команди, які я спробував, (top, ls тощо) працювали без інцидентів, використовуючи ttylog.


Саме те, що я шукав (я використовував його в минулому, але забув назву і не зміг згадати). Велике спасибі, я тимчасово використав брудний варіант (реплікація gdb та вихід).
прузінат

Так, це gdbбув перший варіант, на який я зіткнувся, я сам використовував його в минулому, але для мене це принаймні хакі. Радий, що це вам допомогло!
slm

1
ttylog, здається, не може приєднатися до правильного процесу - чи може хтось відповісти на моє запитання: serverfault.com/questions/560972/…
LittleBobbyTables

21

Справді так і є. Пристрої / dev / vcs * та / dev / vcsa * відповідають пристроям / dev / tty * (віртуальні термінали). F1 = tty1 = vcs1 / vcsa1 тощо. Vcs / vcsa - це як tty для "поточного" віртуального терміналу.

Як корінь, ви можете просто промацати ці пристрої (наприклад, cat / dev / vcs2) і побачити, що знаходиться у відповідному VT (наприклад, / dev / tty2 на on F2), як зробити знімок. vcsa * відрізняється від vcs * тим, що вони включають інформацію про розміри терміналу (екрана). Зауважте, що це лише необроблений знімок персонажів, як вони відображаються на екрані - зібрані з пам'яті, виділеної терміналу, - тому не сподівайтеся на приємний, легко розбірливий вихід.

Недолік полягає в тому, що якщо інформація промайне надто швидко, це може бути важко зафіксувати. Можливо, хвостик -f / dev / vcs1 спрацює, якщо вам потрібно буде дотримуватися декількох скрийнфулів (не пробував себе)? Можливо, найпростіше спочатку просто перенаправити його на файл. Також може бути хорошою ідеєю використовувати VT (F1-F6) для перегляду, оскільки клеми будуть мати однакові розміри. На мій досвід, найкраще використовувати пристрої vcs * - не vcsa * -.

Якщо це не працює, можливо, один з "великих братських" пакетів, що дозволяє адміністратору стежити за активністю на терміналі, може працювати.

PS: Я забув запитати, яку ОС ви використовуєте. Це для Linux, хоча подібні пристрої, ймовірно, є і на інших ОС. Спробуйте знайти "віртуальну пам'ять консолі" серед підручних сторінок для пристроїв.


Чи є спосіб ввести вхід в tty1 з ssh? Наприклад, мені потрібно працювати з малиновим пі-версією під керуванням Debian, але проблема полягає в тому, що він має лише один usb-порт, він переймається адаптером wifi, і тому я не можу фізично приєднати клавіатуру, щоб використовувати з ним tty1. Оскільки мені потрібно запустити скрипт, який під час виконання програми закривається wlan0, у мене фактично виникає ситуація вловлювання 22, яка намагається налагодити те, де цей сценарій не працює. Припустимо, я не можу використовувати концентратор usb ... Чи є спосіб, щоб я якось передати символи в / dev / tty1?
Стівен Лу

2
Ну. Я можу передавати речі /dev/tty1як root, але все це - це відображення символів на екрані, а не введення їх
Стівен Лу

1
Вибачте, якщо це лише шум. це насправді не стовідсотково. Але я відповів на своє запитання в коментарі вище з цим
Стівен Лу

18

подивись на:

man 1 script

наприклад:

script -f /dev/tty1

Я це шукав. Спроба приєднатися screenневдало. Це працює.
sdkks

5

Використовуйте ttyкоманду в кожному терміналі, щоб ідентифікувати їх:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Припускаючи ці TTY, щоб перенаправити stdout першого на другий, запустіть це в першому терміналі:

exec 1>/dev/pts/1

Примітка: Тепер кожен вихід команди відображатиметься на pts / 1

Щоб відновити типову поведінку за замовчуванням pts / 0:

exec 1>/dev/pts/0

Дивіться це відео для демонстрації.


2

Це працювало для мене:

  • За допомогою клавіатури на комп'ютері "A" (тобто фізичного комп'ютера, яким слід керувати), запустіть: screen -q

  • Підключіться з sshкомп'ютера "B" до комп'ютера "A".

  • У сеансі ssh введіть: screen -lsщоб отримати ідентифікатор сеансу, до якого слід підключитися (4 цифри у рядку, що містить tty ).

  • Підключіться до вищевказаного сеансу за допомогою: screen -x <session id>... за допомогою ідентифікаційного номера сеансу, отриманого з screen -lsкоманди вище.

Все, що введено в будь-який "сеанс", відбуватиметься в обох "сесіях", тому, наприклад, набравши текст screen -d, вийдете з БОТИХ сесій.


1

Ще один підхід - використовувати screenутиліту gnu на своїй локальній машині. Викликайте його з -Lопцією, або почніть без цього параметра та скористайтеся ^aHкомандною послідовністю. Будь-який підхід призводить до того, що всі вхідні та вихідні дані записуються у файл, названий screenlog.xде x - номер екрана.

Це зручно, оскільки нічого зайвого не потрібно встановлювати на віддаленій машині.


1

Оскільки я не запускав tty1 з екрану, цей скрипт допоміг:

Я використав відповідь Баарда Копперуда вище. "128" - це 1 рядок мого tty1. Сон можна встановити на відповідну кількість.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Я використовував це в термінаторі і розмірував стовпчик, так що прокрутка - це один рядок тексту.


Дякую за ідею, на програмі я просто повинен був зробити '' 'watch cat / dev / vcs' '' Щоб переглянути процес, який я почав на віртуальній консолі, забувши про використання 'screen'. І я просто налаштував свій gnome-термінал, і я запустив це на 80 символів.
axkibe

0

Відкрийте два клеми. Введіть ttyкожну, і ви отримаєте id як/dev/pts/nº

Тоді в першому ви вводите, script -f /dev/pts/nºofSecondTerminalа в другому ви робите навпаки, script -f /dev/pts/nºofFirstTerminalщоб вони зв'язалися

Вітаю! Обидва термінали виводять і отримують однакові речі. Потрібна третя? Ну, ви вивчали комбінації? Вам знадобиться 6 script -fкоманд. Ще більше тти? Так що ...

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