我正在编写一个 bash 脚本来执行每日备份。该脚本最终将在每天早上自动运行(cron 或 systemd)。
我想要实现的是
- 停止我的服务
- 执行备份程序
- 启动我的服务
我创建的 bash 脚本如下所示:
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# Start myservice
systemctl start myservice.service
我遇到的问题是,当我运行此脚本时,它在 systemctl stop/start 调用期间要求我输入密码。如果要自动运行,显然它不能每次都要求输入密码。如何自动运行此脚本而不要求输入此密码?
Ubuntu 18.04
谢谢!
答案1
根据您的需求和偏好,您有多种选择。
一种明显的做法是……
… 可以将整个脚本root
添加到 中(使用 ),从而以root
用户crontab
身份运行整个脚本。运行sudo crontab -e
时不需要任何密码。缺点是您可能需要以另一个用户(例如)的身份运行备份任务,并且必须切换到该其他用户进行备份。示例:systemctl stop/start myservice.service
noslenkwah
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# ... and run the backup_command as user "otheruser":
sudo -u noslenkwah /path/to/backup_command --with --some --options
# Start myservice
systemctl start myservice.service
另一种方法…
...将systemctl
命令添加到目录中的文件中/etc/sudoers.d
,以便特定用户无需提供密码即可运行它们。
问题
sudo visudo -f /etc/sudoers.d/noslenkwah
(文件名noslenkwah
并不重要,这只是我的个人习惯,以受该文件中的设置影响的“主要”用户的名字来命名文件。它只需要是目录下的一个文件/etc/sudoers.d
。)添加以下行并保存文件。
Cmnd_Alias MYSERVICE = \ /bin/systemctl stop myservice.service, \ /bin/systemctl start myservice.service noslenkwah ALL = (root) NOPASSWD: MYSERVICE
这允许用户noslenkwah
运行sudo systemctl stop myservice.service
并且sudo systemctl start myservice.service
无需密码。它定义了所谓的命令别名(命令集合)命名MYSERVICE
,然后允许
- 用户
noslenkwah
- 在
ALL
电脑上 - 作为用户
root
- 没有密码
- 运行由定义的命令
MYSERVICE
将noslenkwah
和替换myservice
为实际的用户名和服务名称。请注意,您确实必须发出sudo systemctl start myservice.service
才能使其工作(而不是sudo systemctl start myservice
(.service
例如,没有 )。
不关心“在ALL
电脑上”部分。这仅当您打算将同一个文件分发到多台计算机时才有意义sudoers
。
然后你需要将备份脚本更改为
# Stop myservice
sudo systemctl stop myservice.service
# Do all the backing up here...
/path/to/backup_command --with --some --options
# Start myservice
sudo systemctl start myservice.service
并让其以用户身份运行noslenkwah
。
答案2
以 root 身份运行此 shell 脚本。
例如将其放入根 crontab 中:
sudo crontab -e
答案3
您可以将其作为 sudo 运行,或者,创建一个没有主目录的用户,将其添加到 sudoers 文件,赋予它不需要密码的特殊权限并运行该脚本,如 PerlDuck 的答案(第 2 项)所述,然后使用以下命令运行该命令
sudo -u <your_created_user>