前言
在使用 OpenWrt 的 passwall 插件时,有时你需要在特定的时间切换到特定节点,除了去后台手动切换,其实还可以在后台通过 uci 命令自动切换节点。
uci 是什么?
UCI(Unified Configuration Interface)是OpenWrt操作系统中的一个配置框架。UCI提供了一种统一的方式来配置网络路由器和嵌入式设备上的各种系统组件,如网络接口、无线设置、防火墙规则等。
本文将通过 uci 配合 crontab 来达到定时切换指定节点的目的。
获取 passwall 配置信息
先了解 uci 的基本使用方法,后续命令需要使用 uci 来进行操作 passwall 配置信息
root@ImmortalWrt:~# uci -h
uci: unrecognized option: h
Usage: uci [<options>] <command> [<arguments>]
Commands:
batch
export [<config>]
import [<config>]
changes [<config>]
commit [<config>]
add <config> <section-type>
add_list <config>.<section>.<option>=<string>
del_list <config>.<section>.<option>=<string>
show [<config>[.<section>[.<option>]]]
get <config>.<section>[.<option>]
set <config>.<section>[.<option>]=<value>
delete <config>[.<section>[[.<option>][=<id>]]]
rename <config>.<section>[.<option>]=<name>
revert <config>[.<section>[.<option>]]
reorder <config>.<section>=<position>
Options:
-c <path> set the search path for config files (default: /etc/config)
-d <str> set the delimiter for list values in uci show
-f <file> use <file> as input instead of stdin
-m when importing, merge data into an existing package
-n name unnamed sections on export (default)
-N don't name unnamed sections
-p <path> add a search path for config change files
-P <path> add a search path for config change files and use as default
-t <path> set save path for config change files
-q quiet mode (don't print error messages)
-s force strict mode (stop on parser errors, default)
-S disable strict mode
-X do not use extended syntax on 'show'
使用分流模式
了解了 uci 的基本使用语法后,就可以使用 cat /etc/config/passwall 命令来获取 passwall 完整配置信息,我们只需要关注配置信息的 config nodes 信息,即节点信息,也是我们本文的主题
config nodes 'myshunt'
option remarks '分流总节点'
option type 'Xray'
option protocol '_shunt'
option DirectGame '_direct'
option ProxyGame '_default'
option AIGC 'Aqn24Lxv'
option Streaming '_default'
option Proxy '_default'
option Direct '_direct'
option default_node 'dayndoes'
option domainStrategy 'AsIs'
option domainMatcher 'hybrid'
option preproxy_enabled '0'
其中 myshunt 就是需要修改的配置父节点名称,option default_node 'dayndoes' 配置里的 dayndoes 就表示当前默认节点的名称,与下面的节点配置部分对应
config nodes 'dayndoes'
option flow 'xtls-rprx-vision'
option protocol 'vless'
option tcp_guise 'none'
option add_from '导入'
option port '443'
option remarks 'test_reality'
option add_mode '1'
我们可以根据节点的别名,如本例的 remarks 就是 test_reality,代表当前配置的默认代理节点使用的是 test_reality ,后续就是需要替换这个默认节点的 config nodes 后的名称找到即可,比如本例想要将 test_reality 即 dayndoes 替换成别名(remarks)为 test_xhttp 的 node 名为 nightndoes 的节点。
当然也可以使用
uci show passwall获取所有配置信息后进行查看也很直观。
切换默认节点
使用 uci show passwall.myshunt.default_node 获取当前默认节点配置,其中 myshunt 就是上面 passwall 配置信息里 config nodes 'myshunt' 里的节点(nodes)后的名称。
root@ImmortalWrt:~# uci show passwall.myshunt.default_node
passwall.myshunt.default_node='dayndoes'
然后就可以修改节点了
#白天
uci set passwall.myshunt.default_node="dayndoes"
#夜间
uci set passwall.myshunt.default_node="nightndoes"
修改完后查看修改成功没有
root@ImmortalWrt:~# uci show passwall.myshunt.default_node
passwall.myshunt.default_node='nightndoes'
确认修改成功后,提交修改配置后需要重启 passwall 使配置生效
#提交保存 passwall 修改后的配置信息
uci commit passwall
#重启 passwall
/etc/init.d/passwall restart
#按需选择是否重启 haproxy 根据你是否开启负载均衡来决定
/etc/init.d/haproxy restart
然后 OpenWrt 后台 passwall 界面查看节点信息默认节点已经修改了。
定时切换节点
编写脚本
理解并成功按照上面手动切换节点的操作后只需要把这个过程写成一个 shell 脚本 然后放在 crontab 里即可达成定时切换节点的需求了。其实这些都是基本的 Linux 知识。
#!/bin/bash
# 检查是否提供了节点
if [ -z "$1" ]; then
echo "使用方法: $0 <节点>"
exit 1
fi
# 获取参数
PARAM=$1
# 执行 uci 命令
uci set passwall.myshunt.default_node="$PARAM"
uci show passwall.myshunt.default_node
uci commit passwall
# 重启 passwall 服务
/etc/init.d/passwall restart
echo "已成功设置 passwall.myshunt.default_node 为 $PARAM 并重启 passwall 服务。"
-
将脚本保存为文件,例如
set_passwall.sh,且保存到 /opt/docker/ 目录下。 -
给脚本添加可执行权限:
chmod +x set_passwall.sh -
执行脚本并传入节点名:
./set_passwall.sh node1
编辑 crontab
-
打开
crontab编辑器:crontab -e -
添加以下两行定时任务:
0 17 * * * /opt/docker/set_passwall.sh nightndoes >> /opt/docker/logfile.log 2>&1 0 5 * * * /opt/docker/set_passwall.sh dayndoes >> /opt/docker/logfile.log 2>&10 17 * * *表示每天 下午 5 点 执行。0 5 * * *表示每天 早上 5 点 执行。
-
保存并退出编辑器。保存后,
cron会自动加载新的任务。
验证定时任务是否生效
使用以下命令查看当前用户的 crontab 配置,确认任务是否已正确添加:
crontab -l
输出示例:
0 17 * * * /opt/docker/set_passwall.sh nightndoes >> /opt/docker/logfile.log 2>&1
0 5 * * * /opt/docker/set_passwall.sh dayndoes >> /opt/docker/logfile.log 2>&1
直接使用节点模式
使用如下命令获取当前默认 tcp 节点信息,其他节点如 udp 等只需要切换最后的配置名称即可
uci show passwall.@global[0].tcp_node
如果在上面使用分流模式下执行此命令,输出应该是 passwall.@global[0].tcp_node='myshunt'
同理使用如下命令设置使用的节点
uci set passwall.@global[0].tcp_node="nightndoes"
或者
uci set passwall.@global[0].tcp_node="dayndoes"
然后其余步骤和上面一样,提交设置后重启 passwall 即可,shell脚本对应修改就行。
其他插件(如 shadowsocksr plus、 OpenClash)的配置修改大多类似,自行举一反三,需要基本的 Linux 知识就可以操作,实在不行现在还有 AI 帮你!
参考
https://openwrt.org/zh/docs/guide-user/base-system/ucihttps://openwrt.org/zh/docs/techref/uci


