无需终端的 Shell 脚本中的 IPTables XARGS 命令

无需终端的 Shell 脚本中的 IPTables XARGS 命令

我正在尝试配置一条 iptables 规则,该规则查找匹配的 IP 并删除它在一行代码中找到的尽可能多的实例。我有该命令,它在具有路径变量的传统 shell 环境中工作。

这个脚本在没有 shell 终端的情况下运行,它是 openvpn 客户端断开连接脚本的一部分。我有一个可行的解决方案,使用以下命令来优化 --line-number,反向排序,然后循环删除每一行。问题是 IPtables 规则的动态特性可能导致意外删除错误的行。

工作:sudo -tt /sbin/iptables -t mangle -w -n -L --line-numbers | grep -w“$ifconfig_pool_remote_ip”| awk'{print $1}'| sort -nr

for i in $IPTABLES_RULEID ; do
        echo "================= Removing IPv4 Mangle Rule ID $i ===================="
        sudo -tt /sbin/iptables -w -t mangle -D PREROUTING $i
done

以下是我尝试替换的内容:

sudo -tt /sbin/iptables -t mangle -S PREROUTING | /usr/bin/grep -w "$ifconfig_pool_remote_ip" | sed 's/^-A //g' | /usr/bin/xargs -rL1 /sbin/iptables -t mangle -D

该错误表明它没有解析所有命令行选项

1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: iptables v1.8.4 (nf_tables): 无法加载匹配set':No such file or directory Jan 5 00:55:10 vpn1-udp-de openvpn[1240]: Tryiptables -h' 或 'iptables --help' 以获取更多信息。 1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: iptables v1.8.4 (nf_tables): 未知选项“--on-port” 1 月 5 日 00:55:10 vpn1-udp-de openvpn[1240]: 请尝试“iptables -h”或“iptables --help”以获取更多信息。

參考文獻:

/sbin/iptables -t mangle -S PREROUTING | grep -w 10.13.0.6
-A PREROUTING -s 10.13.0.6/32 -p udp -m set --match-set portsudp dst -j TPROXY --on-port 41201 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1
-A PREROUTING -s 10.13.0.6/32 -p tcp -j TPROXY --on-port 41201 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1

答案1

我想知道这样的东西是否会更好

sudo /sbin/iptables -t mangle -S PREROUTING |
/usr/bin/grep -w "$ifconfig_pool_remote_ip" |
sed 's/^-A /iptables -t mangle -D /g' |
sudo /bin/sh -ex
# the -x is just there to echo the commands for debugging.

答案2

不要为此使用 xargs。获取脚本的输出并将其视为标准输入iptables-apply。您可以使用即时 BASH 文件描述符来执行此操作,例如:

iptables-apply <(myscript.sh)

或者,我猜,更传统的方法:

myscript.sh | iptables-apply

请注意,两者之间没有空格<(否则此方法无效。只要 myscript.sh 输出的格式与 iptables save 给出的格式类似,此方法就有效,并且根本不需要 xargs。

相关内容