我使用的是 Ubuntu Server 16.04。每次登录时,我都需要手动运行我的脚本:/home/user/ini.sh
。此脚本调用需要sudo
权限的其他脚本,因此我收到提示,输入密码即可完成。现在我想配置一种方法,在系统启动时自动运行脚本。
我已经使用crontab -e
并添加了行
@reboot /home/user/ini.sh
这似乎不起作用。我尝试了其他用户在这里,这里,这里或者这里。
@reboot user /home/user/ini.sh
@reboot root /home/user/ini.sh
@reboot sh /home/user/ini.sh
*/1 * * * * /home/user/ini.sh
....
添加SHELL=/bin/bash
...但我无法让它工作。我也试过了
@reboot echo "yes" > /home/user/yes.txt
并且文件已创建 - 虽然是空的,里面没有内容(这表明某些东西正在运行,但我在某个地方犯了一个错误)。
我的错误在哪里?
编辑
我也有不成功尝试sudo crontab -e
并使用
@reboot root /home/user/ini.sh
答案1
两者之间有很大区别重启和登录,并且您的系统对它们两者的处理方式截然不同。
REBOOT 作业由 root 用户(而不是您的用户)运行,并且必须是无头的(无显示)。在 16.04 及更高版本中执行启动时作业的最佳方法是创建一个服务并将该服务包含在适当的 systemd 中目标在启动过程中。
输入密码后,LOGIN 作业由您的用户(不是 root)运行。执行登录作业的最佳方法是将它们放在您的
~/.config/autostart/
目录中。
但是您还有第二个问题。您似乎希望用户级作业使用根级服务。有很多方法可以做到这一点。
这最容易方法是每天以 root 身份手动运行脚本。您已经知道如何执行此操作,因此让我们看看其他选项。
这最快的方法是破解文件
sudoers
并生成特殊权限集。但是,它可能无法与系统的其余部分正确备份,AppArmor 可能会阻止某些操作,并且很难排除故障和维护。这合适的方法是将用户级和根级函数分成两个单独的脚本,并使用 dbus 启动根级脚本并返回其输出。这很容易维护和排除故障,但需要最高的技能和对 dbus 的一点了解。