Захват / dev / tty0 вывода в файл - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в Linux, поэтому у меня есть чувство, что ответ тривиален, но после нескольких дней поиска ответа я сдаюсь и рассчитываю на вашу помощь ...

Я использую программное обеспечение на CentOS 7. Когда я запускаю его на псевдотерминале TTY (например, / dev / tty2), на экране выводится много интересной информации, которую мне нужно проанализировать. Из-за объема информации и для архивации я хотел бы сохранить их в файл. Очевидно, что я попытался перенаправить stdout, stderr в файл, но оказалось, что я могу сохранить только небольшую часть информации, видимой на экране терминала (сотни строк). Позже я использовал strace, чтобы выяснить, каким образом приложение выводит эту информацию на экран - это запись на устройство / dev / tty0 (не / dev / tty, а / dev / tty0, видимая в данный момент консоль, что делает - я думаю - - большая разница). Понимая это, я попробовал много возможных решений, чтобы захватить этот вывод, включая:

Все хорошо работает для перехвата записей / dev / tty, но не для / dev / tty0!

Можете ли вы предложить какое-либо решение или даже просто идею, которую я мог бы попробовать?

1 Ответ

0 голосов
/ 24 сентября 2018

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

  1. Метод принудительной предварительной загрузки - простой и быстрый, но сГлавный недостаток в моем случае - это фактически не перехват системных вызовов, а вызовы стандартной библиотеки libc.Недостаток, так как приложение может напрямую вызывать системный вызов, минуя библиотеки, и оно не будет перехвачено.Это произошло в моем случае.

  2. Позже я попробовал модуль ядра, относительно быстро я смог создать базовый модуль с перехватом системных вызовов, изменив адрес функции syscall в syscall_table (требует некоторых грязных хаков, таких как снятие защитызапись в эту память с помощью манипуляции с регистром CR0 и т. д.), но больше я пытался продвинуться, у меня возникло больше проблем, особенно в контексте процесса перехвата, который разветвляет дочерние элементы, и я хочу перехватывать системные вызовы для разветвленных процессов какЧто ж.Конечно, большим плюсом является то, что у вас есть максимальный доступ к любым структурам ядра и т. Д. Через некоторое время я отказался и попробовал третий вариант.

  3. Метод Ptrace - выглядитна первый взгляд сложный, но вполне логичный, но чтобы понять, нужно читать длинного человека.Опять же, для разветвленных процессов все усложняется, но сейчас я близок к созданию работоспособного решения, и такие вещи, как PTRACE_O_TRACEFORK и т. Д., Очень помогают.

Мой вывод - создание универсального решения для этогоВ любом случае, это не легкая вещь (например, посмотрите на исходный код 'strace'), для меня ptrace - лучший вариант, однако вам нужно потратить некоторое время, чтобы понять это, особенно для процессов разветвления.

Заключение №2 - пытаться решить эту проблему - это было для меня большим приключением, и погружение в глубины ядра Linux и то, как работает syscall, было удивительным изучением:)

Спасибо, melpomene, за вдохновение!:)

...