Как я могу перенаправить вывод программы C из /dev/tty в /dev/null?

@ х -Юрий Я также был смущен выходным NAT, но, наконец, я получил ответ. Prerouting и Postrouting NAT предназначены для внешнего NAT, когда некоторые пакеты приходят на ваш интерфейс или выходят из него, и вы хотите NAT адрес. Но OUTPUT NAT предназначен для вашей локальной сети NAT, я имею в виду, когда пакеты запускаются из вашего приложения. Я думаю, что это хороший пример, чтобы понять это лучше. Когда вы хотите изменить порт и IP-адрес трафика в качестве прозрачного прокси, например, что мы делаем в Nginx. Мы можем использовать что-то вроде этого:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --на -пункт назначения 192.168.100.10 :8080

вы отправляете трафик через порт 80 на другой хост в вашей сети 192.168.100.10, который прослушивает свой порт 8080

Думаю, дело в этом. Я надеюсь, что это правда и то, о чем вы просили

9
04.05.2021, 15:25
2 ответа

TL,DR:

script -c myprogram /dev/null </dev/null >/dev/null

Вы не можете «перенаправить» /dev/ttyв том же смысле, в каком вы можете перенаправить стандартный вывод. Стандартный вывод определяется как файловый дескриптор. Программы записываются в любой файл, который уже открыт в файловом дескрипторе 1, когда они запускаются. Некоторые операционные системы предлагают /dev/stdoutкак файл, эквивалентный стандартному выводу, но это «псевдоним» для стандартного вывода. Напротив, /dev/tty— это имя файла, которое относится к управляющему терминалу процесса. Если программа открывает /dev/tty, она явно открывает /dev/tty, и это нельзя перенаправить.

Что вы можете сделать, так это запустить программу с управляющим терминалом, который не совпадает с управляющим терминалом программы, которая ее запускает. Простой способ сделать это с помощью командыscript. В простейшей форме:

script -c myprogram /dev/null >/dev/null

Когда запускается myprogramи открывается /dev/tty, это терминал, предоставленный script, а не терминал, в котором работает script. Что делает script, когда он обнаруживает запись на терминал, так это записывает как в свой собственный стандартный вывод, так и в указанный машинописный файл; поэтому я установил как стандартный вывод script, так и файл машинописного текста на /dev/null.

Если myprogramчитает с терминала, scriptчитает со своего собственного стандартного ввода, поэтому вы, вероятно, захотите также перенаправить его на /dev/null.

Обратите внимание, что scriptне передает статус выхода myprogramвызывающей стороне. Некоторые реализации (, например. в Debian и его производных )есть опция -eдля этого.

16
28.07.2021, 11:35

Это очень необычно, что программа сама открывает /dev/tty. Если вам нужно что-то вывести на консоль, вы просто записываете в стандартный вывод stdout, который можно перенаправить, как Жиль показывает .

Единственным вариантом здесь будет перехват вызова libc fopen, если только он не был встроен (, что не так уж редко )или вызов базовой операционной системы openи его изменение.

Это не так сложно. Вам нужно написать небольшую библиотеку, содержащую указанную функцию open, которая, в свою очередь, вызывает реальную функцию openпосле «санации» ее ввода (, т. е. если имя файла /dev/tty, заменить это с помощью /dev/null ).

Запуск программы, перехват и перенаправление системных вызововпоказывает, как это делается.

0
28.07.2021, 11:35

Теги

Похожие вопросы