Eu quero executar esses dois comandos em um shell interativo, um após o outro (como root e com a tabela "filter" e a cadeia "input" carregadas):
nft define lala=1.2.3.4
nft add rule ip filter input ip saddr \$lala accept
Você pode ver que eu escape do "$" para evitar a expansão do shell. Mas recebo esta mensagem de erro "Identificador desconhecido 'lala'". Se eu não escapar do "$", recebo esta mensagem de erro: "Erro de sintaxe, aceitação inesperada". Se eu escrever \$$lala , recebo esta mensagem de erro: "Syntax error, uneepcted accept, esperando string" e esta regra errada é mostrada: add rule ip filter input ip saddr $ accept.
Então, qual é a sintaxe correta para poder usar variáveis Nft dentro de um shell interativo. Fazer o mesmo dentro de um script Nft funciona bem (sem se preocupar em escapar).
Muito obrigado
Variáveis simbólicas em uso pelo comando
nft
userspace são resolvidas em seus valores apenas por este comando. Onft
comando resolve a variável em seu valor atribuído para montar o resultado final. Em seguida, osnft
comandos usam a API netlink para se comunicar com o kernel e enviar uma nova regra para adicionar. O kernel nunca vêlala=1.2.3.4
nem tem nenhum conceito de variável simbólica.Então, se você dividir seu
nft
comando em duas invocações, o que acontece é:O primeiro
nft
comando define uma variável simbólica para seu próprio uso posterior. Mas não faz mais nada. Ele nem precisa se comunicar com o kernel, pois nenhuma alteração no conjunto de regras é solicitada. (Na verdade ele se comunica, mas para enviar "nada", como no comandonft ''
). Ao final do comando perde-se a definição do símbolo, sem ter sido utilizado.Uma segunda invocação do
nft
comando precisa resolver o$lala
símbolo, mas não consegue encontrar uma definição:nft
pára com um erro.Portanto, tudo isso deve ser feito em uma
nft
invocação para que a segunda instrução ainda saiba sobre a variável simbólica. Existem várias maneiras de fazer isso. Deixei os exemplos abaixonft
dos prompts do shell e do 's que não devem ser digitados.interativo
nft
dois comandos em uma única
nft
invocação.Observe o adicional
;
necessário, pois neste contextonft
recebe uma linha de parâmetros, mas eles devem ser divididos em dois comandos lógicos. Tambémnft
tendo seu próprio analisador, não importa se os comandos são recebidos como um único parâmetro de comando ou vários parâmetros separados. Aqui tudo foi colocado em um par de''
para evitar problemas de shell com ambos;
e$
caracteres.Em seguida
nft
, tem uma opção para ler a partir de um arquivo. Ao ler de um arquivo, todas as entradas fazem parte do mesmonft
contexto de comando.Então, com um arquivo chamado
test.nft
com este conteúdo:Isso pode então ser usado:
A variante abaixo executa um script na " linguagem nftables ". Ter um
test.nft
conteúdo de arquivo como:Então:
Isso também teria funcionado:
Para cada comando anterior, o conjunto de regras resultante é o mesmo (assumindo que a tabela e a cadeia foram criadas antes):
Não haverá mais nenhum vestígio de
$lala
esquerda: o kernel nunca recebeu,$lala
mas apenas1.2.3.4
e é isso que ele devolve.