|
本帖最后由 zjlllli 于 2024-3-14 22:54 编辑
原本以为在/etc/init.d/下创建自定义脚本或者编辑/etc/rc.local就能够自定义启动脚本,没想到重启后文件都复原了。
在观摩了大佬的auto_ssh.sh脚本后,才明白这系统可以通过防火墙添命令添加自启动脚本。
举个例子:开机自启动docker命令,我们先创建自启动脚本
- vim /data/startup_script.sh
复制代码
往脚本中添加内容
- #!/bin/sh
- install() {
- # Add script to system autostart docker
- uci set firewall.startup_script=include
- uci set firewall.startup_script.type='script'
- uci set firewall.startup_script.path="/data/startup_script.sh"
- uci set firewall.startup_script.enabled='1'
- uci commit firewall
- echo -e "\033[32m startup_script complete. \033[0m"
- }
- uninstall() {
- # Remove scripts from system autostart
- uci delete firewall.startup_script
- uci commit firewall
- echo -e "\033[33m startup_script has been removed. \033[0m"
- }
- startup_script() {
- # Put your custom script here.
- echo "Starting custom scripts..."
- }
- main() {
- [ -z "$1" ] && startup_script && return
- case "$1" in
- install)
- install
- ;;
- uninstall)
- uninstall
- ;;
- *)
- echo -e "\033[31m Unknown parameter: $1 \033[0m"
- return 1
- ;;
- esac
- }
- main "$@"
复制代码
接着给予脚本执行权限
- cd /data
- chmod +x startup_script.sh
复制代码
执行脚本安装命令,这将会设置防火墙指定启动脚本
- ./startup_script.sh install
复制代码 执行完这句install命令,你会发现/etc/config/firewall最后会添加这样一段内容
- config include 'startup_script'
- option type 'script'
- option path '/data/startup_script.sh'
- option enabled '1'
复制代码 事实上,这和你手动编辑/etc/config/firewall内容效果是一样的,只不过脚本调用了系统的api设置防火墙方法。同理,你调用了uninstall 命令后,这段内容就会被删掉。
如果不传入参数直接执行./startup_scrip.sh,就会执行脚本里面的startup_script函数。
创建好这个通用自启动脚本后,你可以在startup_script里面添加任意你想要的启动命令。
例如跳过docker的挂载目录检测
- startup_script() {
- sed -i '/valid_mountpath() {/a return 0' /etc/init.d/mi_docker
- /etc/init.d/mi_docker start
- }
复制代码
解释一下函数的含义,这一句是修改了mi_docker的valid_mountpath()函数,往开头添加一行return 0,表示跳过检测。为什么要跳过检测?因为这个valid_mountpath函数一旦检测到容器中挂载了非/mnt/usb-**下的目录就会报错,但是有些应用是需要挂载系统的文件的,比如/etc/resolv.conf,如果你用命令行创建了docker容器,挂载了非usb下的目录,那么路由器后台的docker界面就会报错 "不可用,检测到已安装的Docker文件缺失,请卸载Docker后重新安装"。
- sed -i '/valid_mountpath() {/a return 0' /etc/init.d/mi_docker
复制代码
下面这句表示启动调用mi_docker脚本启动docker,这个脚本是官方固件的。
- /etc/init.d/mi_docker start
复制代码
需要注意的是,防火墙脚本的执行顺序可能优于/etc/init.d/下的的脚本,因此针对某些特殊情况可以延迟执行,例如,在开机的时候修改samba配置并重启samba服务,可能不会马上生效
- sed -i 's/|INTERFACES|/ð0/g' /etc/samba/smb.conf.template
- /etc/init.d/samba restart
复制代码
改成非阻塞式延迟20秒执行,配置就生效了
- sed -i 's/|INTERFACES|/ð0/g' /etc/samba/smb.conf.template
- (sleep 20; /etc/init.d/samba restart) &
复制代码
|
评分
-
查看全部评分
|