我正在 crontab 上运行以下脚本。
@reboot sh /home/root1/ssh.sh
该文件ssh.sh
仅包含
sudo systemctl start ssh.service
但是当设备启动时,SSH 服务未运行。
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset:>
Active: inactive (dead)
Docs: man:sshd(8)
man:sshd_config(5)
lines 1-5/5 (END)
输出如下cat /var/log/cron.log
。
Dec 9 09:40:34 ubuntu cron[843]: (CRON) INFO (pidfile fd = 3)
Dec 9 09:40:34 ubuntu cron[843]: (CRON) INFO (Running @reboot jobs)
Dec 9 09:40:34 ubuntu CRON[915]: (root1) CMD (sh /home/root1/ssh.sh)
Dec 9 09:41:04 ubuntu systemd-timesyncd[709]: Initial synchronization to time server 91.189.89.198:123 (ntp.ubuntu.com).
Dec 9 09:44:56 ubuntu crontab[3018]: (root1) LIST (root1)
请找到如下的输出sudo -l
。
root1@ubuntu:~$ sudo -l
Matching Defaults entries for root1 on ubuntu: <br/>
env_reset, mail_badpass,<br/> secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin <br/>
User root1 may run the following commands on ubuntu:<br/>
(ALL : ALL) NOPASSWD: /home/root1/ssh.sh <br/>
(ALL : ALL) ALL
如果我在 sudoers 中使用“root1 ALL=(ALL:ALL) NOPASSWD:ALL”,则 crontab 会在重新启动时执行 shell 脚本。
但是,如果我使用“root1 (ALL : ALL) NOPASSWD: /home/root1/ssh.sh”,则 shell 脚本在重新启动时无法工作,即使手动执行它也会提示输入密码。
答案1
将其设置在root 的 crontab而不是用户 crontab:
$ sudo crontab -e
打开编辑器后,添加命令@reboot
- 不要输入sudo
命令crontab
。
笔记: 在 root 下运行作业没有特别的安全风险crontab
,只要您使用一些常识。我觉得这里最重要的一点是:对正在运行的脚本的写访问权限应该仅限于 root 用户。这将防止“常规”用户更改将以 root 权限运行的脚本。
答案2
为了从 cron 运行命令,您需要在 sudo 中添加一个无密码条目。使用sudo visudo
,添加以下内容:
root1 ALL=(ALL:ALL) NOPASSWD: /bin/systemctl start ssh.service
每当我授予特定的 sudo 命令访问权限时,我总是使用完整路径,因此请检查您的系统以确保路径systemctl
位于何处。
现在,如果您决定稍后添加到此脚本(尽管我不推荐这样做),您可以将 sudo 条目更改为此
root1 ALL=(ALL:ALL) NOPASSWD: /home/root1/ssh.sh
然后从任何命令中删除 sudo。