Используя POSIX Awk и не беспокоясь о последовательности строк вывода:
echo | awk -v 'netids=10 20 30' -v 'names=eth1 eth2 eth3' '
BEGIN {
netidcount = split(netids, netid)
namecount = split(names, name)
if (netidcount != namecount) {
print "Error: You must pass the same number of names and netids."
exit 1
}
for (i in name) {
for (j in name) {
if (i == j) {
continue
}
printf "iptables -I FORWARD -i %s -src 192.168.%s.0/24 -dst 192.168.%s.0/24 -j DROP\n", name[i], netid[i], netid[j]
}
}
}'
Конечно, вы можете изменить это; например, вы можете поместить приведенный выше awk-скрипт в файл и вызвать его с помощью:
echo | awk -v... -v... -f script.awk
Или вы можете поместить сетевые идентификаторы и имена в data.txt
, возможно, в таком формате:
eth1 10
eth2 20
eth3 30
И напишите файл сценария Awk script.awk
вот так:
#!/bin/awk
NF != 2 {
error = 1
print "Error: Each line of input must contain one interface name and one number."
exit
}
(($1 in nameseen) || ($2 in netidseen)) {
error = 1
print "Error: Each interface name and network id in input must be unique."
exit
}
{
name[NR] = $1
netid[NR] = $2
nameseen[$1]
netidseen[$2]
}
END {
if (error) {
exit error
}
for (i in name) {
for (j in name) {
if (i == j) {
continue
}
printf "iptables -I FORWARD -i %s -src 192.168.%s.0/24 -dst 192.168.%s.0/24 -j DROP\n", name[i], netid[i], netid[j]
}
}
}
А потом так и назови:
awk -f script.awk data.txt
Большой выбор.
Я бы, наверное, data.txt
выглядел как:
eth1 192.168.10.0/24
eth2 192.168.20.0/24
eth3 192.168.30.0/24
Изменение сценария для работы с этим форматом данных оставлено читателю в качестве упражнения. ;)
(Примечание. :Если вы используете этот код, не забудьте указать ссылку на этот ответ в качестве авторства.)
Если есть программы, которым требуется Python 2, они должны явно использовать/usr/bin/python2
(или аналогичный )вместо простого /usr/bin/python
. Однако могут быть некоторые, которые не были обновлены и все еще используют /usr/bin/python
. Те вполне могли сломаться.
Если вы используете Ubuntu 20.04 или новее,python-is-python3
явно делает /usr/bin/python
Python 3. В более старых версиях я бы не рекомендовал менять эту символическую ссылку.