ПРИМЕР:
iptables
: internet - [0: 0] -A internet -m mac --mac-source 48: 5D: 60: FC: 29: B0 -j ВОЗВРАТ
COMMIT
[корень @ localhost: ~] $ arp
Адрес HWtype HWaddress Флаги Маска Iface
10.2.0.1 эфир 48: 5D: 60: FC: 29: B0 C br0
Я хотел бы удалить правило iptable (-D internet -m mac --mac-source 48: 5D: 60: FC: 29: B0 -j RETURN), если mac в списке ARP отсутствует.
На каком языке вы хотите, чтобы этот сценарий был? Любой? Потому что со сценарием оболочки это утомительно, если не сказать больше ...
В противном случае вы могли бы сохранить результат ваших arp + grep и iptables -L в 2 разных файлах, а затем загрузить эти два файла в массив. Тогда это становится довольно просто: вы просматриваете один из массивов, и если он существует / не существует в другом, то удаляете.
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');
}
Что-то вроде этого ... (ПРИМЕЧАНИЕ ПРОТЕСТИРОВАНО!) Обратите внимание, как array_diff () позвонить просто! Ничего подобного в сценарии оболочки я знаю.
Вы также можете распечатать получившуюся таблицу обратно в файл.
file_put_contents('file3.txt', join($to_delete, "\n") . "\n");
Затем используйте это для удаления из оболочки ...
Также вы можете использовать PHP для создания первых двух файлов, используя popen ().