自动更新Hosts文件

刚开始想网上找一个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
#!/bin/sh
s#!/bin/sh
set -e

# Hosts URL 列表
HOSTS_URL1="https://gitlab.com/ineo6/hosts/-/raw/master/next-hosts"
HOSTS_URL2="https://raw.hellogithub.com/hosts"
HOSTS_URL3="https://gh-proxy.com/raw.githubusercontent.com/maxiaof/github-hosts/master/hosts"

# 系统文件
UPDTLOG_FILE="/tmp/app_update.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 "[Hosts Update]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 "[Hosts Update]Successfully downloaded Hosts File [Records:$LINE_COUNT]"
else
log_message "[Hosts Update]Failed to download Hosts File [Records:$LINE_COUNT]"
exit 1
fi

trap 'rm -f "$TMPHOST_FILE"' EXIT


作者

Jet Yu

发布于

2024-05-29

更新于

2025-01-01

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×