我使用以下命令添加特定接口作为受信任区域
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