У вас довольно сложная настройка маршрутизации с четырьмя дополнительными таблицами маршрутизации и дополнительными правилами маршрутизации для меток, установленных брандмауэром. Почти наверняка проблема в этом. Итак, посмотрите на дополнительные таблицы(ip route list table 99
и т. д. ), посмотрите на правила брандмауэра(iptables -t table_name -n -L
для всех table_name
), а затем выясните, что происходит.
Редактировать
Таблицы маршрутизации и таблицы брандмауэра(iptables
)совершенно разные, поэтому iptables -t main -n -L
не имеет смысла, поскольку main
— это таблица маршрутизации, а не таблица брандмауэра.
Пожалуйста, отредактируйте вопрос с выводом ip route list table 97
, ip route list table 98
и т. д., включая 99
и 236
. Также с выводом iptables -t filter -n -L
, iptables -t nat -n -L
и т.д. включая mangle
, raw
и любую другую таблицу, которая может быть указана в правилах. Если вывод слишком длинный, поместите все в pastebin и дайте ссылку на него.
В Интернете есть множество руководств по iptables
и маршрутизации на основе политик, если вы хотите почитать. Но даже если мы выясним, что мешает второму адресу стать адресом-источником, более сложная задача состоит в том, чтобы выяснить, зачем все эти правила, чего хотел добиться человек, устанавливающий эти правила, и как мы можем изменить правила, чтобы второй адрес работал, не нарушая других вещей.
Так что, если вас устраивает ответ «потому что это запрещают какие-то правила брандмауэра», на этом тоже можно остановиться.:-)
Вы можете сделать это с помощью GNU sed, используя флаг e
:
e
This command allows one to pipe input from a shell command into pattern space. If a substitution was made, the command that is found in pattern space is executed and pattern space is replaced with its output. A trailing newline is suppressed; results are undefined if the command to be executed contains a NUL character. This is a GNU sed extension.
при следующих ограничениях:
Затем выполняется все результирующее «пространство шаблона» (, т. е. вся входная строка после поиска и замены ), т. е. не только то, что находится между двумя последними косыми чертами. Это то, что вы показываете в своем примере, но это может быть не то, что вы на самом деле хотите сделать.
в вашей системе /bin/sh
bash
вы экспортировали функцию, как описано здесь Могу ли я «экспортировать» функции в bash?
Так, например, в моей системе (, где /bin/sh
— оболочка dash
по умолчанию ), шаги
sudo ln -sf bash /bin/sh
foo() { echo "Doing foo on $1"; }
export -f foo
тогда я смогу
$ echo bar | sed 's/\(.*\)/foo \1/e'
Doing foo on bar
Вот еще один пример, поясняющий, что вся входная строка после выполнения поиска и замены выполняется:
echo 'bar; echo xx' | sed 's/\(.*\)/foo \1/e'
Doing foo on bar
xx
Если вы не можете сделать так, чтобы /bin/sh
было bash
, то, вероятно, самое близкое, что вы сможете получить, — это поместить определение функции в файл и сначала получить его:
$ echo bar | sed 's/\(.*\)/foo \1/e'
sh: 1: foo: not found
но дано
$ cat./myfuncs.sh
foo() { echo "Doing foo on $1"; }
затем
$ echo bar | sed 's/\(.*\)/..\/myfuncs.sh ; foo \1/e'
Doing foo on bar