如果 rc.local 以 root 身份运行,为什么它不能触及文件

如果 rc.local 以 root 身份运行,为什么它不能触及文件

我希望每次启动时都使用/etc/rc.local.

例如,我的脚本被调用,startscript.sh其存储位置/home/debian如下。它首先尝试创建一个名为 的文件test.log,然后执行其他操作。

但是,我在启动时读到了错误touch: cannot touch ‘test.log’: Permission denied

rc.local根据我的理解,如果以 root 身份运行,因此它执行的任何内容也应该以 root 身份运行,因此无论如何都test.log应该创建,这怎么可能?

startscript.sh:

#!/bin/sh
touch test.log
#... other stuff

rc.local片段:

#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh

答案1

这种方法有两个问题。一是rc.local由 root 执行,因此它创建的所有文件都将归 root 所有,除非您chown在它们上运行。其次,这是一个安全漏洞,root 执行的代码可能会被没有 root 权限的用户修改。

更好的方法是使用@重启cron作为非特权用户的时间说明符。如果您已经有定时任务文件,编辑它以添加此行,然后运行crontab <yourcrontab>命令。或者使用crontab -e命令直接输入这一行。

@reboot /home/debian/startscript.sh

请注意,您不需要sh脚本是否可执行,因为它以#!/bin/sh.

答案2

如果您的发行版使用systemd,问题可能在于/etc/rc.local执行太早了,而根文件系统仍然是只读的,或者某些其他文件系统尚未安装。

.service如果运行的systemd文件rc.local没有配置特定的顺序依赖项,systemd将尽早运行它。

运行systemctl cat rc-local.service以查看运行的服务的完整定义rc.local。注意任何After=线路,并考虑系统启动过程中最早可以满足这些线路的点。您可能想要添加一个覆盖文件,该文件会添加一After=两行以满足您的配置需求。

相关内容