Вам нужно немного написать скрипт. Что-то вроде:
find. -mindepth 2 -type f -print | while read x; do
y=$(basename "$x")
if [ -f "$y" ]; then
mv "$y" "$y".backup
fi
mv "$x" "$y"
done
ipset
имеет подкоманду для атомарной замены двух наборов:swap
(или -W
). Это позволяет заполнить новый набор, заменить его старым набором и удалить бесполезный набор с новым именем. Это лучше, чем сбрасывать набор (с помощью ipset flush china
), потому что это временно оставляет систему незащищенной и позволяет заменить набор другими параметрами без необходимости удалять правила iptables , ссылающиеся на него (, потому что набор не может быть уничтожен, пока на него все еще ссылаются ). Я также переключаюсь на более новый синтаксис ipset , который является единственным сохраненным в последних справочных страницах(оба синтаксиса работают ).
# -exist for idempotence: don't trigger an error the 2nd time this script is run
ipset -exist create china hash:net
# old cn.zone will stay around if download fails
wget -O /etc/cn.zone.tmp http://www.ipdeny.com/ipblocks/data/countries/cn.zone && \
mv /etc/cn.zone.tmp /etc/cn.zone
ipset create china.tmp hash:net
sed 's/^/add china.tmp /' /etc/cn.zone | ipset -exist restore
ipset swap china china.tmp # new set atomically replaces older set
ipset destroy china.tmp
/sbin/iptables-restore < /etc/sysconfig/iptables
Замена цикла на (правильно отформатированные входные данные, подаваемые на )ipset -exist restore
, улучшили загрузку записей на два порядка (здесь проверка цикла увеличилась с ~6 с до ~0,06 с ). -exist
здесь на случай, если сам список ввода содержит дубликаты, чтобы игнорировать их и предотвратить преждевременный аборт при загрузке записей. Если вы считаете, что входной список может содержать неразборчивое содержимое,затем либо отфильтруйте его, чтобы сделать его разборчивым (, например, :удалите любую пустую строку ), либо вернитесь к циклу, но вместо for
лучше используйте конструкцию while read
, например:
while read net; do
ipset -exist add china.tmp "$net"
done < /etc/cn.zone
iptables-restore
можно оставить в текущем скрипте или поместить в отдельный скрипт (, который будет зависеть от этого текущего скрипта, поскольку правила iptables зависят от уже созданного набора ), чтобы сохранить функциональные возможности обновления установка и обновление правил iptables отдельно.
Я уверен, что сценарий можно улучшить (, особенно в отношении загрузки файла cn.zone
, который, как ожидается, не будет работать во время загрузки, даже если это не повлияет на общий результат. Может быть, это тоже следует разделить ).