Доступ к данным с терминала

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

Я не могу использовать tee или такие команды, как prog > file 2>&1 так как программа будет интерактивной.

Например :
Если пользователь вводит ls в терминале я должен проанализировать его, затем он должен перейти в операционную систему, а затем, когда я получу результат после обработки, мне придется снова проанализировать его, прежде чем он отобразится в терминале.

Я провел свое исследование и думаю, что смогу добиться этого через псевдотерминальные интерфейсы (pty).

Пожалуйста, дайте мне знать, если есть лучший способ добиться этого.
я использую cpp а также bash и платформа *nix,

Обновить:
Я также могу использовать libexpect от expect,

0

Решение

Я не уверен, что вы имеете в виду здесь — вы имеете в виду интерактивную программу как «работающую в другом терминале, общающемся с пользователем» или даже отображающую GUI?

Как это определяет терминал? Вероятно, важно, что такое макет программы (какая программа запускается, какая).

Если ваше приложение использует графический интерфейс для взаимодействия с пользователем, я бы просто сделал это следующим образом:
начать bash с sdtin и stdout, прикрепленными к трубам,
ваша программа читает & записывает в конец этих каналов, анализирует данные и читает / пишет на своем собственном stdin&стандартный вывод — так он появляется на своем терминале.

Если вы имеете в виду управление терминалом, отличным от вашего приложения, это происходит, поскольку система, как правило, не ожидает, что программа будет работать на нескольких терминалах. Я не думаю, что возможно фильтровать связь между терминалом и уже работающим приложением, прикрепленным к нему. Запуск другого процесса, порождающего другой терминал, может быть вариантом — иметь в основном два терминала, работающих синхронно. Но тогда вам придется синхронизировать оба процесса с помощью других средств (именованных каналов, сетевого подключения или другого IPC).

Если вы предоставите более подробную информацию о вашей программе, я мог бы предоставить более направленную помощь.

PS Не говорите мне, что вы пишете какой-то терминальный кейлоггер ‘)

РЕДАКТИРОВАТЬ:

Тогда ваша программа, вероятно, основана на графическом интерфейсе — я бы порекомендовал что-то похожее на ответ, связанный с banuj.

Наилучшим вариантом, вероятно, будет создание трех каналов, затем fork, и в дочернем процессе назначьте соответствующие концы каналов stdin, stdout и stderr. Затем дочерний процесс должен выполняться в оболочке — вероятно, bash, хотя я не уверен, что другие оболочки будут звучать лучше, если их читать вслух;) Основной процесс сможет читать / записывать другие концы упомянутых каналов, анализируя как входные, так и выходные данные для bash. и программы это работает.
Вы также можете выполнять команды, указанные пользователем, непосредственно, но это заставляет вас выполнять утомительную работу оболочки — управление текущим каталогом, переменными среды, управление заданиями и так далее.

Использование вышеуказанного метода может, однако, вызвать некоторые проблемы — некоторые программы (обычно в контексте безопасности — например, su (do), запрашивающий пароль) все равно будут пытаться обойти stdin / stdout и читать напрямую с терминального устройства. Я не уверен, что вы можете сделать в таком случае — программирование собственного эмулятора терминала было бы вариантом, но я не знаю, хотите ли вы углубиться в системное программирование для этого.

Если вам нужен фрагмент кода, если вы не знаете, как это сделать, просто спросите;)

2

Другие решения

Других решений пока нет …