Как я могу подключиться к выходу одного терминала от другого терминала?

45

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

pruzinat
источник
5
Хотя я понимаю, что иногда возникает необходимость перехватить контент на другом tty после выполнения команды, унция предотвращения стоит фунта лечения, поэтому всегда рассматривайте возможность начала использования screenили tmuxперед запуском команды, к которой вы, возможно, захотите получить доступ из другого терминала. ,
depquid
И когда вы можете подготовить его раньше, возможно, tmate был бы хорошим кандидатом, который работает даже через Интернет, а не только локально. (и имеет необязательный доступ для записи)
rugk

Ответы:

23

Я наткнулся на этот инструмент под названием ttylog. Это программа Perl, доступная на CPAN здесь . У него есть пара предостережений, одно из которых заключается в том, что я могу только выяснить, как подключить терминал, который был создан как часть чьего-то действия в мою коробку. Другое дело, что вы должны запускать его с повышенными привилегиями (например, root или sudo).

Но это работает!

Например

Первый ssh ​​в вашу коробку в ТЕРМИНЕ № 1:

TERM#1% ssh saml@grinchy

Обратите внимание на tty этого нового терминала:

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.

сс терминалов

Все команды, которые я пробовал (top, ls и т. Д.), Работали без происшествий ttylog.

SLM
источник
Именно то, что я искал (я использовал это в прошлом, но забыл имя и не мог вспомнить). Большое спасибо, я временно использовал грязную опцию (gdb и выходная репликация).
празинать
Да, это gdbбыл первый вариант, с которым я столкнулся, я использовал его сам в прошлом, но это, по крайней мере, для меня хакерство. Рад, что это помогло вам!
slm
1
Хотя ttylog не может присоединиться к правильному процессу - может кто-нибудь ответить на мой вопрос: serverfault.com/questions/560972/…
LittleBobbyTables
21

В самом деле. Устройства / dev / vcs * и / dev / vcsa * соответствуют устройствам / dev / tty * (виртуальные терминалы). F1 = tty1 = vcs1 / vcsa1 и так далее. Vcs / vcsa похож на tty для «текущего» виртуального терминала.

В качестве пользователя root вы можете просто отслеживать эти устройства (например, cat / dev / vcs2) и посмотреть, что находится на соответствующем VT (например, / dev / tty2 на F2), например, сделать снимок. vcsa * отличается от vcs * тем, что содержит информацию о размерах терминала (экрана). Имейте в виду, это просто необработанный снимок символов, отображаемых на экране, собранных из памяти, выделенной для терминала, так что не ожидайте хорошего, легко разбираемого вывода.

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

Если это не сработает, возможно, подойдет один из пакетов «старшего брата», который позволяет администратору следить за активностью терминала.

PS: я забыл спросить, какую ОС вы используете. Это для Linux, хотя подобные устройства, вероятно, существуют и в других ОС. Попробуйте найти «память виртуальной консоли» среди man-страниц для устройств.

Баард Копперуд
источник
Есть ли способ ввести ввод в tty1 из SSH? Например, мне нужно работать с Raspberry Pi, на котором запущен Debian, но проблема в том, что у него только один USB-порт, он занят адаптером Wi-Fi, и поэтому я не могу физически подключить клавиатуру для использования с ним tty1. Так как мне нужно запустить сценарий, который в процессе выполнения завершает работу wlan0, у меня фактически возникает ситуация catch-22, пытающаяся отладить в случае сбоя этого сценария. Предположим, я не могу использовать USB-концентратор ... есть ли способ как-то передать символы в / dev / tty1?
Стивен Лу
2
Что ж. Я могу перенаправить материал в /dev/tty1качестве пользователя root, но все, что он делает, это отображает символы на экране, а не вводит их
Стивен Лу,
1
Извините, если это просто шум. это не совсем актуально на 100%. Но я ответил на мой вопрос в комментарии выше с этим
Стивен Лу
18

посмотри на:

man 1 script

например:

script -f /dev/tty1
Роберт
источник
Я искал это. Попытка присоединиться с screenтреском провалилась. Оно работает.
sdkks
5

Используйте ttyкоманду в каждом терминале, чтобы идентифицировать их:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Предполагая, что эти TTY, чтобы перенаправить стандартный вывод первого на второй, запустите это в первом терминале:

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завершит ОБА сеансы.

Ixx
источник
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

Я использовал это в терминаторе и определил размер столбца, чтобы прокрутка была одной строкой текста.

Джефф Т
источник
Спасибо за идею, в rasperry мне просто нужно было сделать '' 'watch cat / dev / vcs' '', чтобы посмотреть процесс, который я запустил на виртуальной консоли, забыв об использовании 'screen'. И я просто настроил свой gnome-терминал, в котором я его запустил, до 80 символов в ширину.
Axkibe
0

Откройте два терминала. Введите ttyкаждый, и вы получите его идентификатор как/dev/pts/nº

Затем в первом вы вводите, script -f /dev/pts/nºofSecondTerminalа во втором вы делаете противоположное, script -f /dev/pts/nºofFirstTerminalчтобы они были связаны

Congrats! Оба терминала выводят и получают одинаковые вещи. Нужен третий? Ну, вы изучали комбинации? Вам понадобится 6 script -fкоманд. Еще больше tty? Скоро...

Марсело Тейшейра Руджери
источник