白夜瞭望

夢の中の夢
うつし世はゆめ 夜の夢こそまこと
  1. 首页
  2. Linux技术
  3. 正文

Linux定期换端口脚本

2023年3月18日 3583点热度 2人点赞 0条评论

Contents

一、写脚本的理由

搬瓦工机器被盯上,流量稍大就被封端口。最短封禁时间不到一天,手动换端口很麻烦。

在 ChatGpt 的帮助下,写了一个定时脚本,每半个小时更新 V2ray 与 Clash 配置。当然,不止搬瓦工,其他主机商比如Vultr也可以如法炮制。

虽然实际结果是不如ipv6稳……

二、Linux自动校准时间

不管是 v2 还是的自动脚本,都要求系统时间准确,所以需要设置一下自动校准时间。
用的是 systemd 自带的时间同步服务。

# 编辑设置文件:
sudo nano /etc/systemd/timesyncd.conf

# 修改时间服务器部分如下
[Time]
NTP=time.google.com ntp.aliyun.com ntp.ntsc.ac.cn 0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org 0.fr.pool.ntp.org 0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org

# 时间同步服务开机启动,并立即启动:
sudo systemctl --now enable systemd-timesyncd

# 查看时间同步服务状态
sudo systemctl status systemd-timesyncd

三、自动换端口的bash脚本

#!/bin/bash

# 端口数组,后三位,随便敲
port_array=(610 991 202 443 224 505 216 637 208 209 150 101 902 133 904 155 706 107 538 229 500 431 550 663 504 805 804 497 758 519)

# 获取当前小时数,减号的作用是去掉前导的 0(09 =» 9)
hour=$(date +%-H)

# 计算当前半小时段
if [ $(date +%-M) -lt 30 ]; then
    index=$((hour * 2))
else
    index=$((hour * 2 + 1))
fi
echo "候补IP: 23${port_array[@]}"
echo "候补IP数: ${#port_array[@]}"
# 获取当前需要使用的端口
port=${port_array[$index % ${#port_array[@]}]}

# 打印新端口
echo "New port = 23"$port

#  停止 v2ray 服务
systemctl stop v2ray

#  更改 v2ray 服务端口。端口初始值,需要是23XXX
sed -i "s/\"port\": 23[0-9]\+/\"port\": 23$port/" /usr/local/etc/v2ray/config.json

#  重新启动 v2ray 服务
systemctl start v2ray

# 更改 clash 订阅文件里的端口,端口初始值,需要是23XXX
sed -i "s/port: 23[0-9]\+/port: 23$port/" /home/user/config.yaml

解释一下脚本的含义
1. port_array 定义了所允许的端口数组的后三位(为了不影响其他配置的端口,限定为23开头的五位数)。
2. hour 使用 date +%-H 获取当前小时数。
3. 计算出当前半小时段:如果当前分钟数小于 30,使用当前小时数 * 2 作为半小时段的索引,否则使用当前小时数 * 2 + 1 作为索引。
4. 使用 % 运算符循环地选出使用的端口。
5. 使用 sed 更改 v2ray 配置文件中的端口号。
6. 停止和重新启动 v2ray 服务以应用更改。同时更新clash订阅文件里的端口。

四、定时运行脚本

使用Linux 的 cron 任务,让脚本每半小时运行一次,自动更改端口。在终端中输入 crontab -e 打开您的 crontab 编辑器。在文件末尾添加以下行:

0,30 * * * * /usr/bin/bash /path/to/change-port-script.sh

当然,不要忘记启动定时任务:

systemctl enable --now cronie.service
# or
systemctl enable --now cron.service

五、Clash 订阅设置

手机端的Clash for Android ,设置每30分钟更新一次设置,然后在1分或31分手动更新一次即可。

PC端的Clash For Windows,可以使用 cron 更新订阅。在对应的 Profile 文件上右键,点Settings,然后在“Update Cron”下面的文本框里贴入如下内容,就可以在1分与31分自动更新。

1,31 * * * *

参考文档

sed 字符串替换

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2023年3月22日

bai

文案为生的业余画师,偶尔客串程序员。

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

Copyright © 2022 yumenaka.net All Rights Reserved.

Theme Kratos Made By Seaton Jiang