![如何使用firewalld命令将多个接口添加到受信任区域?](https://linux22.com/image/117987/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8firewalld%E5%91%BD%E4%BB%A4%E5%B0%86%E5%A4%9A%E4%B8%AA%E6%8E%A5%E5%8F%A3%E6%B7%BB%E5%8A%A0%E5%88%B0%E5%8F%97%E4%BF%A1%E4%BB%BB%E5%8C%BA%E5%9F%9F%EF%BC%9F.png)
我使用以下命令添加特定接口作为受信任区域
firewall-cmd --zone=trusted --change-interface=eth0
现在假设我有多个接口(如 eth0、eth1、bond0、bond1),并且我想通过执行在 bash 脚本中编写的上述命令将所有接口添加一次。
通过执行一次上述命令来添加所有接口的语法和命令是什么?
答案1
这将获取所有设备名称,然后继续为每个接口运行命令。
for i in $( ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d' ); do
firewall-cmd --zone=trusted --change-interface=$i
echo "Added $i to trusted\n"
done
答案2
假设您在使用该ip
命令(但不是它的变体)的 Linux 系统上busybox
,我们可能会使用.addr
ip -j addr
根据该结果,我们可以使用 JSON 处理器jq
提取接口名称并创建可以评估的 shell 代码:
eval "$(
ip -j addr |
jq -r 'map(
["firewall-cmd", "--zone=trusted", "--change-interface=" + .ifname],
["printf", "added %s to trusted\\n", .ifname] | @sh )[]'
)"
在我拥有的 Ubuntu 虚拟机上,这将评估以下命令:
'firewall-cmd' '--zone=trusted' '--change-interface=lo'
'printf' 'added %s to trusted\n' 'lo'
'firewall-cmd' '--zone=trusted' '--change-interface=enp0s3'
'printf' 'added %s to trusted\n' 'enp0s3'
'firewall-cmd' '--zone=trusted' '--change-interface=enp0s8'
'printf' 'added %s to trusted\n' 'enp0s8'
'firewall-cmd' '--zone=trusted' '--change-interface=docker0'
'printf' 'added %s to trusted\n' 'docker0'
或者,我们可以创建一个更传统的 shell 循环,仅迭代接口名称:
ip -j addr | jq -r 'map(.ifname)[]' |
while IFS= read -r ifn; do
firewall-cmd --zone=trusted --change-interface="$ifn"
printf 'added %s to trusted\n' "$ifn"
done
答案3
这避免了前面答案中复杂且无法解释的 sed 语法
devlist=`netstat -i |cut -f1 -d' '`
for dev in ${devlist}; do
echo "Adding $dev to trusted"
firewall-cmd --zone=trusted --change-interface=$dev
done