【发布时间】:2020-01-08 17:41:32
【问题描述】:
以下代码作为 cronjob 运行以检索和保存 IP 列表,将文件拆分为 2,并将 2 个文件中的每一个加载到 2 个 ipset 中。该列表被拆分,因为它超过 65,535 行。该代码有效,但它很丑陋,我很感激一些关于如何使它更好/更清洁/更快的反馈。
#!/bin/bash
curl -s "https://example.com/files/list.ipset" > /tmp/ipset.txt
TOTAL_LINES=$(wc -l </tmp/ipset.txt)
((LINES_PER_FILE=(TOTAL_LINES+2-1)/2))
split --lines=${LINES_PER_FILE} /tmp/ipset.txt /tmp/setsplit.
for f in /tmp/setsplit.*; do
x="$(echo $f | sed 's/\/tmp\/setsplit\.//g')"
iptables -t mangle -D PREROUTING -m set --match-set "$x" src,dst -j DROP
ipset destroy "$x"
ipset create "$x" hash:ip
while read LINE; do ipset add "$x" $LINE; done < "$f"
iptables -t mangle -I PREROUTING -m set --match-set "$x" src,dst -j DROP
done
rm -rf /tmp/setsplit.* /tmp/ipset.txt
我主要关心的是变量 x 的创建方式。 Split 创建以下文件,for 循环会对其进行迭代:
/tmp/setsplit.aa
/tmp/setsplit.ab
有没有更好的方法使用 $f 的“aa”和“ab”部分作为 ipset 名称,而不是使用 echo/sed 创建变量 x?或者更好的是,带有数字增量的基本名称,例如:ipset destroy ListX 其中 X 是 for 循环处理的每个文件的唯一编号?
【问题讨论】:
标签: bash for-loop while-loop iptables