openwrt - Openwrt 脚本 - 自动启动 Shadowsocks
问题描述
我想为 openwrt 创建一个脚本,它每天都会更改 Shadowsocks 服务中的一些变量。这是脚本,但我不知道把它放在哪里或如何设法每天或每次重启路由器时调用它。
#!/bin/sh /etc/rc.common
restart=0
for i in `uci show shadowsocks | grep alias | sed -r 's/.*\[(.*)\].*/\1/'`
do
server=$(uci get shadowsocks.@servers[${i}].alias)
result=$(nslookup $server)
new_ip=$(echo "${result}" | tail -n +3 | awk -F" " '/^Address 1/{ print $3}')
if [ -n "$new_ip" ]; then
logger -t shadowsocks "nslookup $server -> $new_ip"
old_ip=$(uci get shadowsocks.@servers[${i}].server)
if [ "$old_ip" != "$new_ip" ]; then
logger -t shadowsocks "detect $server ip address change ($old_ip -> $new_ip)"
restart=1
uci set shadowsocks.@servers[${i}].server=${new_ip}
fi
else
logger -t shadowsocks "nslookup $server fail"
fi
done
if [ $restart -eq 1 ]; then
logger -t shadowsocks "restart for server ip address change"
uci commit shadowsocks
/etc/init.d/shadowsocks restart
fi
解决方案
您可以使用cron实用程序。Cron 是类 Unix 计算机操作系统中基于时间的作业调度程序。它允许在指定时间运行作业/程序/脚本。
OpenWrt 默认自带一个 cron 系统,由 busybox 提供。
默认情况下未启用 Cron,因此您的作业将不会运行。在 Openwrt 中激活 cron:
/etc/init.d/cron start
/etc/init.d/cron enable
参考:https ://oldwiki.archive.openwrt.org/doc/howto/cron
现在考虑您的问题,如果您想每天运行提到的脚本:
crontab -e
使用命令编辑 cron 文件。并写在下面一行。
0 0 * * * sh /path/to/your/script.sh
此命令将在 00:00(每天午夜)运行您的脚本。您可以轻松地修改上述命令以在任何其他时间安排您的工作。生成 cron 作业条目的良好参考:https ://crontab.guru/
要查看 crontab 是否正常工作:
tail -f /var/log/syslog | grep CRON
现在来到您的第二个问题“每次重新启动路由器时运行脚本”:
您可以将脚本放在/etc/rc.local中。该文件将在 Openwrt 中的 /etc/rc.d/S95done 每次启动时作为 shell 脚本执行。因此,只需编辑 /etc/rc.local 并sh /path/to/your/script.sh
确保您的脚本是可执行的并正确执行您的任务。
推荐阅读
- css - 在 Material UI BottomNavigationAction 上添加伪元素
- android - 二进制 XML 文件第 17 行:膨胀类 com.google.android.material.textfield.TextInputLayout 时出错
- c# - 如何使用参数从命令行运行 Xunit 测试
- r - 使用序号在 data.frame 列中继续数字系列
- python - Django 部署后的服务器错误 (500)
- windows - C/C++ / Windows 10:如何枚举像 diskpart 这样的卷?
- maven - 将 Maven 插件用于 Sonatype OSS 索引时出现“未绑定 org.sonatype.ossindex.maven.common.ComponentReportAssistant 的实现”错误
- javascript - 从服务器获取精确的 ping(毫秒)
- python - 根据条件获取最小日期和最大日期之间的时间差
- ios - 仅当用户访问我的应用程序中的特定网站时,我如何才能显示警报?