Как внедрить функцию bash в выражение sed?

У вас довольно сложная настройка маршрутизации с четырьмя дополнительными таблицами маршрутизации и дополнительными правилами маршрутизации для меток, установленных брандмауэром. Почти наверняка проблема в этом. Итак, посмотрите на дополнительные таблицы(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и маршрутизации на основе политик, если вы хотите почитать. Но даже если мы выясним, что мешает второму адресу стать адресом-источником, более сложная задача состоит в том, чтобы выяснить, зачем все эти правила, чего хотел добиться человек, устанавливающий эти правила, и как мы можем изменить правила, чтобы второй адрес работал, не нарушая других вещей.

Так что, если вас устраивает ответ «потому что это запрещают какие-то правила брандмауэра», на этом тоже можно остановиться.:-)

2
17.02.2020, 00:43
1 ответ

Вы можете сделать это с помощью 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.

при следующих ограничениях:

  1. Затем выполняется все результирующее «пространство шаблона» (, т. е. вся входная строка после поиска и замены ), т. е. не только то, что находится между двумя последними косыми чертами. Это то, что вы показываете в своем примере, но это может быть не то, что вы на самом деле хотите сделать.

  2. в вашей системе /bin/shbash

  3. вы экспортировали функцию, как описано здесь Могу ли я «экспортировать» функции в 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
4
28.04.2021, 23:23

Теги

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