
例:
iptables
:インターネット - [0:0] -A インターネット -m mac --mac-source 48:5D:60:FC:29:B0 -j 戻る
専念
[root@localhost:~] $ arp
アドレス HWtype HWaddress フラグ マスク Iface
10.2.0.1 エーテル 48:5D:60:FC:29:B0 C br0
ARP リストに MAC が存在しない場合は、iptable ルール (-D internet -m mac --mac-source 48:5D:60:FC:29:B0 -j RETURN) を削除したいと思います。
答え1
そのスクリプトをどの言語で書きたいですか? どれでもかまいません。シェル スクリプトでは、控えめに言っても面倒です...
あるいは、arp + grep と iptables -L の結果を 2 つの異なるファイルに保存し、その 2 つのファイルを配列に読み込むこともできます。そうすれば、配列の 1 つを調べて、もう 1 つに存在しない場合は削除するだけで、非常に簡単になります。
arp |grep br0 | perl -nle '/her ([^ ]+)/ && print $1' >file1.txt
iptables -t mangle -L -v -n |grep MAC | perl -nle '/MAC ([^ ]+)/ && print $1' >file2.txt
php do-delete.php
そして、do-delete.php はファイルを読み込み、system() 呼び出しを実行してエントリを削除することができます。
<?php
$f1 = file("file1.txt");
$f2 = file("file2.txt");
$to_delete = array_diff($f2, $f1);
foreach($to_delete as $mac)
{
system('iptables -t mangle -D internet -m mac --mac-source ' . $mac . ' -j RETURN');
}
こんな感じです...(注:テスト済み!)配列差分()呼び出しは簡単です! シェル スクリプトでは、このようなことは起こりません。
結果の表をファイルに出力することもできます。
file_put_contents('file3.txt', join($to_delete, "\n") . "\n");
次に、それを使用してシェルから削除を実行します...
また、PHPを使用して最初の2つのファイルを生成することもできます。開く()。