OpenClash从入门到精通

网心云设备IP更新

  1. 配置这个文件/etc/hotplug.d/iface/99-lan-ip
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
#!/bin/sh

# 检查动作,如果是关闭接口则跳过
[ "$ACTION" = "ifup" ] || exit 0

# 强制定义环境变量路径
export PATH="/usr/sbin:/usr/bin:/sbin:/bin"

LOG_FILE="/root/ShWrt007.txt"
CUR_TIME=$(date "+%Y-%m-%d %H:%M:%S")

# 1. 获取内网 IP (增加对不同接口名称的兼容)
# 尝试 br-lan,如果为空则尝试 eth0
LAN_IP=$(ip -4 addr show br-lan | grep "inet " | awk '{print $2}' | cut -d/ -f1)
[ -z "$LAN_IP" ] && LAN_IP=$(ip -4 addr show eth0 | grep "inet " | awk '{print $2}' | cut -d/ -f1)

sleep 5

# 2. 获取公网 IP (使用绝对路径,并添加 -L 处理重定向)
# 使用 ip.sb 或 cip.cc/ip
WAN_IP=$(/usr/bin/curl -s4L --connect-timeout 10 http://ip.sb | tr -d '\r\n' || echo "获取失败")

# 3. 覆盖写入文件
{
echo "更新时间: $CUR_TIME"
echo "内网 IP: $LAN_IP"
echo "公网 IP: $WAN_IP"
} > $LOG_FILE


# SEND_KEY="SCT327668TkEBawsz8LU9DJXVA4qstHhfG"
# IP_INFO=$(cat /root/ShWrt007.txt)
# curl -s -d "title=ShWrt007_IP更新&desp=$IP_INFO" https://sctapi.ftqq.com/$SEND_KEY.send

# ====== GitHub Gist 上传 ======
GIST_ID="019e7946ec2b0c49db38478f4c7378bb"
TOKEN="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"


CONTENT=$(cat /root/ShWrt007.txt | sed ':a;N;$!ba;s/\n/\\n/g')

curl -s -X PATCH "https://api.github.com/gists/$GIST_ID" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"files\":{\"ShWrt007.txt\":{\"content\":\"$CONTENT\"}}}"
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

#!/bin/sh

# 等待网络完全就绪
sleep 5

# 检查动作,如果是关闭接口则跳过
# [ "$ACTION" = "ifup" ] || exit 0

# 强制定义环境变量路径
export PATH="/usr/sbin:/usr/bin:/sbin:/bin"

# 配置信息
GIST_ID="019e7946ec2b0c49db38478f4c7378bb"
TOKEN="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"
FILE="ShWrt007"

# 1. 获取当前更新时间
TIME=$(date "+%Y-%m-%d %H:%M:%S")

# 2. 获取内网 IP (优先 br-lan, 备选 eth0)
LAN_IP=$(ip -4 addr show br-lan 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d/ -f1)
[ -z "$LAN_IP" ] && LAN_IP=$(ip -4 addr show eth0 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d/ -f1)

# 3. 获取公网 IP
WAN_IP=$(curl -s4L --connect-timeout 10 http://ip.sb | tr -d '\r\n')
[ -z "$WAN_IP" ] && WAN_IP="获取失败"

# 4. 直接在变量中构造文件内容 (使用 \n 作为换行符)
CONTENT="更新时间: $TIME\n内网 IP: $LAN_IP\n公网 IP: $WAN_IP"

# 5. 构造 JSON 并上传
# 使用 printf 组合 JSON,避免 echo 处理反斜杠时的歧义
JSON_PAYLOAD=$(printf '{"files": {"%s": {"content": "%s"}}}' "$FILE" "$CONTENT")

curl -s -X PATCH "https://api.github.com/gists/$GIST_ID" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "$JSON_PAYLOAD" > /dev/null

# (可选) 如果你想在系统日志里看到结果,可以取消下面这一行的注释
logger "Gist IP update triggered at $TIME"
  • 上传到Github
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
62
63
#!/bin/sh

# 环境变量
export PATH="/usr/sbin:/usr/bin:/sbin:/bin"

# --- 配置信息 ---
TOKEN="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"
OWNER="khyxlove"
REPO="TvBox"
FILE_PATH="ShWrt008"
BRANCH="main"

# 1. 获取信息
TIME=$(date "+%Y-%m-%d %H:%M:%S")
LAN_IP=$(ip -4 addr show br-lan 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d/ -f1)
[ -z "$LAN_IP" ] && LAN_IP=$(ip -4 addr show eth0 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d/ -f1)
WAN_IP=$(curl -s --connect-timeout 5 myip.ipip.net/s | tr -d '\r\n')
[ -z "$WAN_IP" ] && WAN_IP="获取失败"

# 2. 构造文本内容
RAW_CONTENT="更新时间: $TIME | 内网 IP: $LAN_IP | 公网 IP: $WAN_IP"

# 3. Base64 编码 (针对 OpenWrt 兼容性处理)
if command -v base64 >/dev/null 2>&1; then
CONTENT_BASE64=$(echo -n "$RAW_CONTENT" | base64 | tr -d '\n')
elif command -v openssl >/dev/null 2>&1; then
CONTENT_BASE64=$(echo -n "$RAW_CONTENT" | openssl enc -a -A)
else
# 如果以上都没有,提示错误
echo "错误: 系统缺少 base64 或 openssl 工具,无法编码。"
exit 1
fi

# 4. 获取原文件 SHA (增加错误处理)
echo "正在获取 SHA..."
SHA_RESPONSE=$(curl -sk -H "Authorization: token $TOKEN" \
"https://api.github.com/repos/$OWNER/$REPO/contents/$FILE_PATH?ref=$BRANCH")

SHA=$(echo "$SHA_RESPONSE" | sed -n 's/.*"sha": "\(.*\)".*/\1/p' | head -n 1)

# 如果 SHA 为空,说明可能是第一次创建文件,或者路径不对
if [ -z "$SHA" ]; then
echo "警告: 未获取到 SHA (可能是新文件)"
SHA_JSON=""
else
SHA_JSON=",\"sha\":\"$SHA\""
fi

# 5. 上传/更新文件
# 注意:PAYLOAD 内部引号需谨慎处理
PAYLOAD="{\"message\":\"Update IP $TIME\",\"content\":\"$CONTENT_BASE64\"$SHA_JSON,\"branch\":\"$BRANCH\"}"

echo "正在上传到 GitHub..."
RESULT=$(curl -X PUT -sk \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" \
"https://api.github.com/repos/$OWNER/$REPO/contents/$FILE_PATH")

# 简单判断是否成功
echo "$RESULT" | grep -q "content" && echo "任务执行成功!" || echo "任务可能执行失败,请检查输出。"

echo "任务执行完毕"

便宜机场

一分机场,良心云,便宜机场

提供免登录免翻墙的代理软件下载的网盘

  • 点开之后,点击文件名,点击下载即可,无需登录 网盘地址

免费VPN

OpenClash从入门到精通

不用懂YAML规则,用ChatGPT搞定所有YAML分流规则:域名站点走国内、走国外,新建独立策略组,完美网络37

公共DNS大全

OpenClash 面板zashboard图标

https://github.com/liandu2024/little/tree/main/zashboard
https://raw.githubusercontent.com/liandu2024/little/refs/heads/main/zashboard/zashboard-20250417.json

科学上网工具Sub-Store部署使用全攻略:管理节点与订阅的最佳方式,自建节点、多机场、多终端用户必看!

自建节点

短链接

Emoji表情 https://www.emojiall.com/zh-hans

网心云OpenWrt 设备信息

  • 老家的IP 10.18.0.2 用户名:root 密码:Lt@545818