Я должен написать программу, которая перехватывает данные с терминала, и я должен разобрать его. После обработки, когда данные, я должен проанализировать его, прежде чем он идет в стандартный вывод.
Я не могу использовать tee
или такие команды, как prog > file 2>&1
так как программа будет интерактивной.
Например :
Если пользователь вводит ls
в терминале я должен проанализировать его, затем он должен перейти в операционную систему, а затем, когда я получу результат после обработки, мне придется снова проанализировать его, прежде чем он отобразится в терминале.
Я провел свое исследование и думаю, что смогу добиться этого через псевдотерминальные интерфейсы (pty).
Пожалуйста, дайте мне знать, если есть лучший способ добиться этого.
я использую cpp
а также bash
и платформа *nix
,
Обновить:
Я также могу использовать libexpect
от expect
,
Я не уверен, что вы имеете в виду здесь — вы имеете в виду интерактивную программу как «работающую в другом терминале, общающемся с пользователем» или даже отображающую GUI?
Как это определяет терминал? Вероятно, важно, что такое макет программы (какая программа запускается, какая).
Если ваше приложение использует графический интерфейс для взаимодействия с пользователем, я бы просто сделал это следующим образом:
начать bash с sdtin и stdout, прикрепленными к трубам,
ваша программа читает & записывает в конец этих каналов, анализирует данные и читает / пишет на своем собственном stdin&стандартный вывод — так он появляется на своем терминале.
Если вы имеете в виду управление терминалом, отличным от вашего приложения, это происходит, поскольку система, как правило, не ожидает, что программа будет работать на нескольких терминалах. Я не думаю, что возможно фильтровать связь между терминалом и уже работающим приложением, прикрепленным к нему. Запуск другого процесса, порождающего другой терминал, может быть вариантом — иметь в основном два терминала, работающих синхронно. Но тогда вам придется синхронизировать оба процесса с помощью других средств (именованных каналов, сетевого подключения или другого IPC).
Если вы предоставите более подробную информацию о вашей программе, я мог бы предоставить более направленную помощь.
PS Не говорите мне, что вы пишете какой-то терминальный кейлоггер ‘)
РЕДАКТИРОВАТЬ:
Тогда ваша программа, вероятно, основана на графическом интерфейсе — я бы порекомендовал что-то похожее на ответ, связанный с banuj.
Наилучшим вариантом, вероятно, будет создание трех каналов, затем fork, и в дочернем процессе назначьте соответствующие концы каналов stdin, stdout и stderr. Затем дочерний процесс должен выполняться в оболочке — вероятно, bash, хотя я не уверен, что другие оболочки будут звучать лучше, если их читать вслух;) Основной процесс сможет читать / записывать другие концы упомянутых каналов, анализируя как входные, так и выходные данные для bash. и программы это работает.
Вы также можете выполнять команды, указанные пользователем, непосредственно, но это заставляет вас выполнять утомительную работу оболочки — управление текущим каталогом, переменными среды, управление заданиями и так далее.
Использование вышеуказанного метода может, однако, вызвать некоторые проблемы — некоторые программы (обычно в контексте безопасности — например, su (do), запрашивающий пароль) все равно будут пытаться обойти stdin / stdout и читать напрямую с терминального устройства. Я не уверен, что вы можете сделать в таком случае — программирование собственного эмулятора терминала было бы вариантом, но я не знаю, хотите ли вы углубиться в системное программирование для этого.
Если вам нужен фрагмент кода, если вы не знаете, как это сделать, просто спросите;)
Других решений пока нет …