介绍
之前我们写过一个自动检测被墙并更换IP的脚本,但是那是在境外vps运行,并且只针对墙IP的情况的,无法解决墙端口不墙IP的问题,要解决这个问题还是得在境内机上跑脚本。
昨天那个脚本是采用的while true
循环,经群内大佬指点,此类脚本还是采用 cron
定时任务更为合适,因此更新如下:
- 去掉 while true 循环:每次执行脚本时,cron 会自动调用脚本,不需要 while 循环来持续检测。每次调用脚本时,脚本会执行一次端口检测。
- 假如我们设置每隔10分钟的
cron
定时任务,那么RETRY_AFTER_CHANGE=600
(等待 10 分钟)就不再必要了,因为crontab
本身会在每次执行时隔 10 分钟,所以无需再在脚本内设置等待时间。所以我们将RETRY_AFTER_CHANGE
这部分内容删除。
前提
- 境外vps已经做好了DDNS
- 境内vps可以通过密钥登录境外vps
脚本
这里我们分三种情况:
DDNS+公网api
#!/bin/bash
# 配置部分
DOMAIN="你的DDNS域名" # 直接用域名检测端口
PORT=xxx # 你要检测的端口
CHANGE_IP_API="xxx" # IP更换api
CHECK_INTERVAL=10 # 检测间隔(秒)
# 端口检测方法(从国内服务器检测 DDNS 绑定的 VPS)
check_tcp() {
timeout 5 nc -z -v $DOMAIN $PORT &>/dev/null
return $? # 返回 0 说明端口通,返回 1 说明端口被墙
}
echo "$(date) - 检测 $DOMAIN:$PORT"
# 检测端口是否被墙
if ! check_tcp; then
echo "$(date) - 端口 $PORT 被墙,正在更换 IP..."
curl -s "$CHANGE_IP_API" # 触发换 IP
echo "$(date) - 换 IP 请求已发送"
else
echo "$(date) - 端口 $PORT 正常"
fi
DDNS+内网API
#!/bin/bash
# 配置部分
DOMAIN="xxx" # 你的 DDNS 域名
PORT=xxx # 你要检测的端口
VPS_SSH="root@$DOMAIN -p xxx" # 使用 DDNS 域名和端口 xxx 登录外网 VPS
API_CMD="curl -s xxx" # xxx为IP更换api(内网)
# 端口检测方法(通过 DDNS 域名检测端口)
check_tcp() {
timeout 5 nc -z -v $DOMAIN $PORT &>/dev/null
return $? # 返回 0 说明端口通,返回 1 说明端口被墙
}
# 检测端口是否被墙
echo "$(date) - 检测 $DOMAIN:$PORT"
if ! check_tcp; then
echo "$(date) - 端口 $PORT 被墙,正在通知外网 VPS 更换 IP..."
# 使用 SSH 执行远程命令更换 IP
ssh -o StrictHostKeyChecking=no $VPS_SSH "$API_CMD"
echo "$(date) - IP 更换请求已发送"
else
echo "$(date) - 端口 $PORT 正常"
fi
公网IP获取API+公网IP更改API
#!/bin/bash
# 配置部分
PORT=xxx # 需要检测的端口
CHANGE_IP_API="xxx" # IP更换api
SHOW_IP_API="xxx" # IP获取api
# 获取 VPS 当前公网 IP
get_current_ip() {
curl -s "$SHOW_IP_API"
}
# 端口检测方法(从国内服务器检测 VPS)
check_tcp() {
local ip=$1
timeout 5 nc -z -v $ip $PORT &>/dev/null
return $? # 返回 0 说明端口通,返回 1 说明端口被墙
}
# 初始化当前 VPS IP
VPS_IP=$(get_current_ip)
echo "$(date) - 当前 VPS IP: $VPS_IP"
echo "$(date) - 检测 $VPS_IP:$PORT"
# 检测端口是否被墙
if ! check_tcp "$VPS_IP"; then
echo "$(date) - 端口 $PORT 被墙,正在更换 IP..."
curl -s "$CHANGE_IP_API" # 触发换 IP
echo "$(date) - 换 IP 请求已发送"
else
echo "$(date) - 端口 $PORT 正常"
fi
运行方式
复制并保存脚本为 .sh
文件。
将脚本添加到 crontab
:
- 编辑
crontab
: 在终端中输入以下命令来编辑crontab
:crontab -e
- 设置定期运行脚本: 在打开的编辑器中添加以下一行,设置定期运行脚本的频率。例如,以下命令每 10 分钟运行一次脚本:
*/10 * * * * /path/to/your/script.sh
如果不想保存日志可以:
*/10 * * * * /path/to/your/script.sh > /dev/null 2>&1
如果您希望每分钟执行一次,则可以改为:
* * * * * /path/to/your/script.sh
- 保存并退出编辑器。
注意事项:
- 脚本权限:确保脚本具有执行权限,可以使用以下命令赋予执行权限:
chmod +x /path/to/your/script.sh
- 查看日志:可以将脚本输出重定向到日志文件,以便查看执行日志。例如:
*/10 * * * * /path/to/your/script.sh >> /path/to/logfile.log 2>&1
这样,您就可以将该脚本通过 crontab
定期执行,检测端口是否被墙并在需要时更换 IP。