Никогда не встраивайте {}
в код оболочки! Это создает уязвимость инъекции команд. Обратите внимание, что для cat "{}"
проблема не только в символах "
, \
, `
, $
(рассмотрим, например, файл с именем ./$(перезагрузка)/accept_ra
).
(кстати, некоторые реализации находят
не позволяют этого сделать, а POSIX оставляет поведение неопределенным , когда {}
не является само по себе аргументом для найти
)
здесь, вы захотите передать имена файлов в качестве отдельных аргументов в sh
(а не в аргументе code), а в строчном скрипте sh
(в аргументе code), чтобы ссылаться на них с помощью параметров позиционирования:
find . -name accept_ra -exec sh -c 'echo 0 > "$1"' sh {} \;
Или, чтобы избежать выполнения одного sh
в каждом файле:
find . -name accept_ra -exec sh -c 'for file do
echo 0 > "$file"; done' sh {} +
То же самое относится к xargs -I{}
или zsh
's zargs -I{}
. Не пишите:
Что было бы такой же уязвимостью инъекции команд, как и в find
выше, но:
"$file"; done' sh
Что также имеет преимущество, так как позволяет избежать запуска по одному sh
на файл и ошибки, когда list.txt
не содержит ни одного файла.
С помощью zsh
zargs
вы, вероятно, захотите использовать функцию, а не вызывать sh -c
:
do-it() cmd > $1
zargs ./*.txt -- do-it
Обратите внимание, что во всех вышеприведенных примерах второй sh
идет в строчный скрипт $0
. Вы должны использовать там что-то соответствующее (например, sh
или find-sh
), а не такие вещи, как _
, -
, --
или пустую строку, так как значение в $0
используется для сообщений об ошибках в оболочке оболочки:
$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' inline-sh {} \;
inline-sh: ./accept_ra: Permission denied
GNU parallel
работает по-другому. С ним вы делаете , а не , чтобы использовать sh -c
, так как parallel
уже запускает оболочку и пытается заменить {}
на аргумент, процитированный в правом синтаксисе для оболочки.
{}'
Lo siento, no puedo proporcionar un ejemplo de trabajo, pero lo que necesita debería poder lograrse utilizando el objetivo CONNTRACK de netfilter. Lo que diferencia esto de MARK regular es que CONNTRACK marca todo el tráfico en una conexión, mientras que MARK solo marca paquetes. Entonces, la idea sería:
Las conexiones que vienen a través de eth1 serían CONNMARKed con fwmark 1, que se mantendría para todos los paquetes (entrantes y salientes ); lo mismo sucedería con las conexiones que vienen a través de eth2, con fwmark 2. Así, el firewall siempre sabrá qué interfaz usar en las respuestas. Las conexiones iniciadas desde el firewall o los hosts detrás de él pasarían por cualquier interfaz/puerta de enlace que elija como principal.
Tal vez pueda hacer esto más fácilmente usando algún software de firewall preempaquetado, como Shorewall . Tiene soporte multi -ISP, aunque no sé si usa CONNTRACK o simplemente MARK.