刚开始想网上找一个OpenWRT系统上更新Hosts文件,但是发现要么就是简单粗暴直接下载要么只能下载单个文件再启动服务。 毕竟不是运维出身,于是花了一晚上功夫边学边写的,目前运行良好。
更新日志
20250101 修复了文件获取失败导致无法继续执行的问题。
20240716 修复了log输出时时间戳不准确的问题。
20240624 修改wget方式,合并去重以及格式化。
20240601 增加了下载是否成功并且行数大于0验证。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #!/bin/sh set -eHOSTS_URL1="输入你想去广告的Hosts地址" HOSTS_URL2="输入你想去广告的Hosts地址" HOSTS_URL3="输入你想去广告的Hosts地址" UPDTLOG_FILE="/tmp/update_hosts.log" TMPHOST_FILE=$(mktemp ) ETCHOST_FILE="/etc/hosts" log_message () { echo "$(date "+%Y-%m-%d %H:%M:%S" ) $1 " >> "$UPDTLOG_FILE " } download_hosts () { local url=$1 local output output=$(/usr/bin/wget --timeout =10 --no-hsts -qO- "$url " 2>/dev/null) if [ $? -eq 0 ]; then echo "$output " else log_message "Failed to download from $url " return 1 fi } { download_hosts "$HOSTS_URL1 " || true download_hosts "$HOSTS_URL2 " || true download_hosts "$HOSTS_URL3 " || true } | sed -e '/^[[:space:]]*$/d' -e '/^[0-9]/!d' | sort -uk2 | awk '!seen[$0]++' | awk '{printf "%-20s %s\n", $1, $2}' > "$TMPHOST_FILE " LINE_COUNT=$(wc -l < "$TMPHOST_FILE " ) if [ -s "$TMPHOST_FILE " ] && [ "$LINE_COUNT " -gt 0 ]; then cp "$TMPHOST_FILE " "$ETCHOST_FILE " && \ if command -v systemctl >/dev/null 2>&1; then systemctl restart dnsmasq else /etc/init.d/dnsmasq restart fi && \ log_message "Update Hosts File Successful[Records:$LINE_COUNT ]" else log_message "Update Hosts File Failed[Records:$LINE_COUNT ]" exit 1 fi trap 'rm -f "$TMPHOST_FILE"' EXIT