Моя ситуация следующая: у меня много маленьких штуковин (довольно близко к маршрутизаторам, не совсем, но в любом случае это не имеет значения); они работают под управлением дистрибутива 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?