Hosts文件更新

刚开始想网上找一个OpenWRT系统上更新Hosts文件,但是发现要么就是简单粗暴直接下载要么只能下载单个文件再启动服务。
毕竟不是运维出身,于是花了一晚上功夫边学边写的,目前运行良好。

  • 20240624

1.修改了一下wget方式。
2.把去重以及格式化合并一起了。

  • 20240601

1.加了检查下载是否成功并且行数大于0的Check

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
#!/bin/sh

set -e

# 定义hosts文件的URL
HOSTS_URL1="https://mirror.ghproxy.com/https://raw.githubusercontent.com/xndeye/adblock_list/main/rule/hosts.txt"
HOSTS_URL2="https://hosts.gitcdn.top/hosts.txt"
HOSTS_URL3="https://raw.hellogithub.com/hosts"

# 定义各类文件路径
UPDTLOG_FILE="/tmp/update_hosts.log"
TMPHOST_FILE="/tmp/tmp_hosts"
ETCHOST_FILE="/etc/hosts"

# 获取当前时间戳
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")

# 定义错误处理和日志记录
log_message() {
echo "$CURRENT_TIME $1" >> "$UPDTLOG_FILE"
}

# 下载hosts文件并合并去重并格式化
{
/usr/bin/wget --no-hsts -qO- "$HOSTS_URL1"
/usr/bin/wget --no-hsts -qO- "$HOSTS_URL2"
/usr/bin/wget --no-hsts -qO- "$HOSTS_URL3"
} | 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")

# 检查下载是否成功并且行数大于0
if [ -s "$TMPHOST_FILE" ] && [ "$LINE_COUNT" -gt 0 ]; then
# 复制处理后的hosts文件到/etc/hosts,并重启dnsmasq服务
cp "$TMPHOST_FILE" "$ETCHOST_FILE" && \
/etc/init.d/dnsmasq restart && \
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

作者

Jet Yu

发布于

2024-05-29

更新于

2024-06-24

许可协议

评论