Перехват прямого перенаправления в / dev / tty - PullRequest
5 голосов
/ 21 ноября 2008

Я работаю над контроллером приложения для программы, которая выплевывает текст непосредственно в /dev/tty.

Это контроллер производственного приложения, который должен уметь перехватывать весь текст, поступающий на терминал. Как правило, это не проблема. Мы просто перенаправляем stdout и stderr. Это конкретное приложение выполняет прямые вызовы echo и перенаправляет результат в / dev / tty (echo "some text" > /dev/tty). Перенаправления через контроллер моего приложения не могут перехватить текст.

У меня есть источник для этого приложения, но я не могу его изменить, и он больше не поддерживается. Любые идеи о том, как поймать и / или выбросить вывод?

Ответы [ 4 ]

4 голосов
/ 21 ноября 2008
 screen -D -m yourEvilProgram

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

[ Добавлено : две ссылки, Rackaid и Pixelbeat и домашняя страница на GNU ]

3 голосов
/ 02 ноября 2010

Это то, что я сделал в Python

import pty, os

pid, fd = pty.fork()
if pid == 0: # In the child process execute another command
    os.execv('./my-progr', [''])
    print "Execv never returns :-)"
else:
    while True:
        try:
            print os.read(fd,65536),
        except OSError:
            break
3 голосов
/ 11 сентября 2009

Классическим решением для управления таким приложением является Expect , которое устанавливает псевдо-терминалы, ведет журналирование и управляет управляемым приложением из сценария. Он поставляется с большим количеством примеров сценариев, поэтому вы, вероятно, можете просто адаптировать его под свои нужды.

2 голосов
/ 21 ноября 2008

Я не могу точно определить, будет ли упомянутая @flolo программа screen делать то, что вам нужно, или нет. Возможно, но я не уверен, есть ли встроенное средство ведения журнала, которое, кажется, то, что вам нужно.

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

Если вам в конечном итоге понадобится написать собственный, вам, вероятно, потребуется использовать псевдо-tty (pty), и ваш контроллер приложения будет находиться между реальным терминальным подключением пользователя и устройством pty, где он может регистрировать все, что вам нужно, чтобы войти. Это не тривиально. Вы можете найти информацию об этом в книге Рочкинда " Advanced UNIX Programming, 2nd Edn " и, несомненно, в других подобных книгах (книга Стивенса "Расширенное программирование в среде UNIX" - вероятный кандидат, но я У меня нет копии, чтобы проверить это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...