Я не хочу запускать исполняемый файл, загруженный с какого-то случайного сайта, но готов поспорить, что ngrok
явно открывается и пишет в /dev/tty
, чтобы представить информацию о его соединении.
Устройство /dev/tty
относится к «управляющему терминалу» процесса, который является одной из вещей, которые процесс наследует от своего родителя. Переназначение дочерних элементов stdin
, stdout
и stderr
не влияет на его управляющий терминал. Таким образом, в этом случае дочерний элемент сохраняет тот же управляющий терминал, что и родительский элемент, и когда дочерний элемент открывает и записывает в /dev/tty
, вывод идет прямо на экран родителя, не проходя через дочерний stdout
или stderr
или ваш псевдо -терминал.
Чтобы добиться того, что вы ищете, вам необходимо отделить ребенка от управляющего терминала родителя и установить sh подчиненный конец псевдотерминала в качестве управляющего терминала ребенка. Это включает вызовы setsid
и / или setpgrp
, некоторую манипуляцию дескриптора файла и, возможно, некоторые другие движения. Все это обрабатывается login_tty
, если вы работаете в C.
Хорошая новость заключается в том, что в модуле Python pty
есть метод, который выполняет все эти функции для вы. Этот метод pty.spawn
. Он доступен в Python 2 и 3. Я связался с документацией Python 3, потому что она намного, намного лучше и включает в себя пример программы. pty.spawn
в основном ведет себя как комбинация fork
, exec
, openpty
и login_tty
.
Если вы переделываете свою программу, чтобы использовать pty.spawn
для запуска ngrok
, тогда я почти уверен, что вы получите то поведение, которое ищете.