@ х -Юрий Я также был смущен выходным 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
Думаю, дело в этом. Я надеюсь, что это правда и то, о чем вы просили
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
для этого.
Это очень необычно, что программа сама открывает /dev/tty. Если вам нужно что-то вывести на консоль, вы просто записываете в стандартный вывод stdout
, который можно перенаправить, как Жиль показывает .
Единственным вариантом здесь будет перехват вызова libc fopen
, если только он не был встроен (, что не так уж редко )или вызов базовой операционной системы open
и его изменение.
Это не так сложно. Вам нужно написать небольшую библиотеку, содержащую указанную функцию open
, которая, в свою очередь, вызывает реальную функцию open
после «санации» ее ввода (, т. е. если имя файла /dev/tty, заменить это с помощью /dev/null ).
Запуск программы, перехват и перенаправление системных вызововпоказывает, как это делается.