これらの2つのコマンドを対話型シェルで次々に実行したいと思います(ルートとして、「フィルター」テーブルと「入力」チェーンをロードして):
nft define lala=1.2.3.4
nft add rule ip filter input ip saddr \$lala accept
シェルの展開を避けるために「$」をエスケープしているのがわかります。しかし、このエラーメッセージ「不明な識別子 'lala'」が表示されます。 「$」をエスケープしないと、代わりに次のエラーメッセージが表示されます。「構文エラー、予期しない受け入れ」。代わりに\ $$ lalaと書くと、代わりに次のエラーメッセージが表示されます。「構文エラー、受け入れられていない受け入れ、文字列が必要です」という誤った規則が表示されます。
それでは、対話型シェル内でNft変数を使用できるようにするための正しい構文は何ですか。 Nftスクリプト内で同じことを行うと、うまく機能します(エスケープの心配はありません)。
どうもありがとう
シンボリック変数nft
userspaceコマンドで使用中の値に解決されますonlyこのコマンドによって。 nft
コマンドは、変数を割り当てられた値に解決して、最終結果を組み立てます。 次にnft
コマンドは netlink API を使用してカーネルと通信し、新しいルールをに送信します追加。カーネルneverはlala=1.2.3.4
を認識せず、シンボリック変数の概念もありません。
したがって、nft
コマンドを2つの呼び出しに分割すると、次のようになります。
最初のnft
コマンドは、後で使用するためのシンボリック変数を定義します。しかし、他には何もしません。ルールセットの変更は要求されないため、カーネルと通信する必要さえありません。 (実際には通信しますが、コマンドnft ''
のように "何も"を送信しません)。コマンドの最後で、シンボルの定義は使用されずに失われます。
nft
コマンドの2回目の呼び出しでは、$lala
シンボルを解決する必要がありますが、定義が見つかりません:nft
はエラーで停止します。
したがって、これはすべてonenft
呼び出しで実行する必要があるため、2番目のステートメントは依然としてシンボリック変数について認識しています。これには複数の方法があります。入力しないでくださいシェルとnft
のプロンプトの下の例を残しました。
インタラクティブ nft
-i, --interactive
インタラクティブなreadline CLIから入力を読み取ります。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
1つのnft
呼び出しで2つのコマンド。
# nft 'define lala=1.2.3.4; add rule ip filter input ip saddr $lala accept'
このコンテキストではnft
がパラメーターの1行を受け取るため、必要な追加の;
に注意してください。ただし、これらは2つの論理コマンドに分割する必要があります。また、nft
には独自のパーサーがあり、コマンドが単一のコマンドパラメーターとして受信されるか、複数の個別のパラメーターとして受信されるかは関係ありません。ここでは、''
と;
の両方の文字に関するシェルの問題を回避するために、すべてが$
のペアで囲まれています。
次に、nft
には、ファイルから読み取るオプションがあります。ファイルから読み取る場合、すべての入力は同じnft
コマンドコンテキストの一部です。
-f, --file filename
ファイル名から入力を読み取ります。ファイル名が-の場合、標準入力から読み取ります。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
以下のバリアントは、「nftables言語」でスクリプトを実行します。 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
のみを受信しました。