Linux: захват вывода уже запущенного процесса (в чистом C!) - PullRequest
4 голосов
/ 20 января 2011

Моя ситуация следующая: у меня много маленьких штуковин (довольно близко к маршрутизаторам, не совсем, но в любом случае это не имеет значения); они работают под управлением дистрибутива Linux на основе MIPS.

Чтобы управлять ими, можно подключиться по телнету (через последовательный порт) и выдать команды интерактивной оболочке, похожей на bash, которая затем записывает некоторые выходные данные. Вход и выход оболочки подключены к /dev/ttyAS0.

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

I:

1) может устанавливать (маленькие, <500 КБ) программы внутри гизмо 2) не может изменить ОС, сценарии запуска, оболочку, что-нибудь 3) иметь root-доступ 4) знать, как написать сервер SOAP 5) знать, как получить сообщение SOAP, преобразовать его в команду и внедрить в / dev / ttyAS0 6) НЕ ЗНАЮ, как захватить ответ оболочки 7) знать, как, имея ответ оболочки, преобразовать его обратно в сообщение SOAP и ответить на исходный запросчик. </p>

В общем, проблема в 6): как, вставив строку в / dev / ttyAS0 и, таким образом, заставив ее выполнить оболочку, перехватить вывод оболочки?

Мне известно о

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

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

Итак, подведем итог:

Как root может захватить стандартный вывод уже запущенного процесса, IN PURE C, без gdb или strace, без доступа к способу запуска процесса?

Или - почти эквивалентно - как захватить то, что записывается на терминал, IN PURE C?

Ответы [ 2 ]

2 голосов
/ 23 января 2011

Возможно, вы захотите взглянуть на reptyr . Вероятно, потребуется некоторая адаптация для работы вашей системы, хотя

0 голосов
/ 20 января 2011

Вы пробовали управлять последовательным портом с помощью скрипта kermit ? Я, вероятно, воздержусь от попыток вставить более хитрый прокси на устройстве и просто попробовать управлять существующим интерфейсом.

Если вы действительно хотите получить его на устройстве, вы можете посмотреть на источник, например, screen или kermit , чтобы понять, как они взаимодействуют с TTYs.

...