Как я могу отслеживать связь между процессом и терминалом?

StackOverflow https://stackoverflow.com/questions/3410348

Вопрос

У меня есть процесс Linux, разработанный сторонней компанией, который взаимодействует с терминалом.Для отладки я хочу видеть, как обмен данными происходит взад-вперед.

Можно было бы подумать cat сделал бы свое дело (чтобы увидеть одно направление):

    ./third-party-app &
    cat /dev/tty

...но это не так.Скорее, cat это приведет к краже половины данных, предназначенных для приложения, что в значительной степени бесполезно.

стороннее приложение жестко запрограммировано, чтобы предполагать /dev/tty.

Один из способов, который я нашел, чтобы шпионить за сообщением, - это переименовать /dev/tty устройство для того, чтобы, скажем, /dev/real_tty и создайте именованный канал с именем /dev/tty на своем месте.Затем бег:

    cat /dev/real_tty | tee /dev/tty &

... по крайней мере, позволит мне увидеть результат /dev/real_tty, путем копирования данных из /dev/real_tty к именованному каналу /dev/tty и stdout.

Такой способ работает, но он кажется действительно хитроумным и основан на хитрости замены устройства.Это также не работает в обоих направлениях, потому что именованные каналы передают данные только в одном направлении.

Как правильно это сделать?

Если кому-то интересно, устройство TTY представляет собой соединение RS-232 с микроконтроллером.Эта информация не является конфиденциальной или защищенной.Все процессы (приложения и шпионы) могут запускаться от имени root.

Это было полезно?

Решение

Вы можете взглянуть на slsnif.. Отказ Это делает именно то, что вы хотите, или если вы заинтересованы в написании одного самостоятельно, источник доступен, чтобы увидеть, как он работает.

Другие советы

Вы считаете, что используете stroace / ltrace.? Вы можете увидеть системные вызовы, которые он делает, в частности, вы можете видеть, что вы можете сделать вызовы записи / IOCTL и т. Д.

RS-232.? Просто нажмите линии RXD / TXD / GND с зажимами. Это было навсегда, так как я видел любое устройство, даже заботу о DCD, DTR и т. Д.

Есть некоторые альтернативы:

Сделай это с GDB: Перенаправление выхода из проработанного процесса

Криопид Позволяет захватить состояние проработанного процесса в Linux и сохранить его в файл. Этот файл может затем использоваться для возобновления процесса позже после перезагрузки или даже на другой машине.

Распределенная многопоточная контрольная точка Является ли инструментом прозрачно контрольно-пропускной точки состояния произвольной группы программ, распространяемых на многих машинах и соединенных сокетами.

Тот Самый script существует программа, позволяющая сделать это с помощью psudo-терминала.Устройство /dev/tty обычно является специальным и ссылается на управляющий терминал текущего процесса, поэтому вам, возможно, не пришлось прибегать к переименованию объектов.

script открывает psudo-терминал, а затем запускает другой экземпляр вашей оболочки с этой новой оболочкой в качестве управляющего терминала (так /dev/tty ссылается на этот psudo-терминал для этой оболочки и ее дочерних процессов).Опция -c позволяет вам запускать определенную команду, а не вашу оболочку.

Основная проблема с script заключается в том, что невозможно определить, каким способом данные записаны в выходной файл (./typescript по умолчанию) происходило - данные, текущие в обе стороны, сбрасываются в один и тот же файл и выглядят аналогично тому, что появляется на экране при использовании интерактивного терминала (за исключением включения экранирования, возврата каретки и тому подобных глупостей, а также обычно отображаемых символов).

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

Не просто (не для меня, по крайней мере), но механизм, который должен работать для серийных драйверов TTY, является Линия дисциплина.

Люди здесь уже сделали хорошие предложения, но вот еще один:

Вы также можете написать общую библиотеку своими собственными write() это делает какую-то работу до того, как позвонить write() от libc.so. Отказ Тогда вы можете использовать LD_PRELOAD Переменная среды для загрузки вашей библиотеки при запуске процесса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top