Я хочу запустить эти две команды в интерактивной оболочке, одну за другой (как root и с загруженной таблицей «filter» и «input» цепочкой):
nft define lala=1.2.3.4
nft add rule ip filter input ip saddr \$lala accept
Вы можете видеть, что я избегаю символа «$», чтобы избежать расширения оболочки. Но я получаю это сообщение об ошибке «Неизвестный идентификатор lala». Если я не экранирую символ «$», я получаю вместо этого сообщение об ошибке: «Синтаксическая ошибка, непредвиденное принятие». Если я напишу \ $$ лала вместо этого я получаю это сообщение об ошибке: «Синтаксическая ошибка, неподтвержденный прием, ожидающая строка», и отображается это неправильное правило: добавить правило ip filter input ip saddr $ accept.
Итак, каков правильный синтаксис, чтобы иметь возможность использовать переменные Nft внутри интерактивной оболочки. То же самое внутри сценария Nft работает хорошо (не беспокоясь о побеге).
большое спасибо
Символьные переменные используется nft
пространство пользователя команда разрешена в свои значения только по этой команде. В nft
команда преобразовывает переменную в присвоенное ей значение, чтобы собрать окончательный результат. затем в nft
команды используют netlink API для связи с ядром и отправки ему нового правила для добавления. Ядро никогда видит lala=1.2.3.4
также не имеет понятия символической переменной.
Итак, если вы разделите свой nft
в двух вызовах происходит следующее:
Первый nft
Команда определяет символьную переменную для дальнейшего использования. Но больше ничего не делает. Ему даже не нужно связываться с ядром, поскольку не требуется изменение набора правил. (На самом деле он общается, но для отправки «ничего», как с командой nft ''
). В конце команды определение символа теряется, но не используется.
Второй вызов nft
команде необходимо разрешить $lala
символ, но не могу найти определение: nft
останавливается с ошибкой.
Так что все это должно быть сделано в один nft
вызов, поэтому второй оператор все еще знает о символьной переменной. Есть несколько способов сделать это. Я оставил в примерах ниже оболочку и nft
подсказки, которые не следует вводить.
интерактивный nft
-i, --interactive
Прочтите ввод из интерактивного интерфейса командной строки readline. Ты можешь использоватьquit
для выхода или используйте маркер EOF, обычно это CTRL-D.
# nft -i
nft> define lala=1.2.3.4
nft> add rule ip filter input ip saddr $lala accept
nft> quit
две команды в одном nft
призыв.
# nft 'define lala=1.2.3.4; add rule ip filter input ip saddr $lala accept'
Обратите внимание на дополнительные ;
необходимо, потому что в этом контексте nft
получает одну строку параметров, но их следует разбить на две логические команды. Также nft
имея собственный синтаксический анализатор, ему все равно, принимаются ли команды как один параметр команды или как несколько отдельных параметров. Здесь все было заключено в пару ''
чтобы избежать проблем с оболочкой с обоими ;
и $
персонажи.
затем nft
есть возможность читать из файла. При чтении из файла все входные данные являются частью одного и того же nft
командный контекст.
-f, --file filename
Прочитать ввод из имени файла. Если имя файла -, читать из stdin.скрипты nft должны запускаться
#!/usr/sbin/nft -f
Итак, с файлом с именем test.nft
имеющий это содержание:
define lala=1.2.3.4
add rule ip filter input ip saddr $lala accept
Затем это можно использовать:
# nft -f test.nft
Вариант ниже выполняет сценарий в "столы язык ". Имея test.nft
содержимое файла как:
#!/usr/sbin/nft -f
define lala=1.2.3.4
add rule ip filter input ip saddr $lala accept
Затем:
# chmod a+rx test.nft
# ./test.nft
Это также сработало бы:
# nft -f - <<'EOF'
> define lala=1.2.3.4
> add rule ip filter input ip saddr $lala accept
> EOF
Для каждой предыдущей команды результирующий набор правил одинаков (при условии, что таблица и цепочка были созданы ранее):
# nft list chain ip filter input
table ip filter {
chain input {
type filter hook input priority filter; policy accept;
ip saddr 1.2.3.4 accept
}
}
Больше не будет никаких следов $lala
осталось: ядро не получено $lala
но только 1.2.3.4
и вот что он возвращает.