我/usr/local/bin
有以下脚本sdown
/usr/local/bin$ cat sdown
#!/bin/bash
if [ $# -lt 1 ];
then
echo "no time set"
else
sudo shutdown -h $1
fi
权限为 788:-rwxr-xr-- user user sdown
重点是,如果我运行脚本,它会提示输入 sudo 密码:
/usr/local/bin$ sdown 13:37
[sudo] password for user:
为了让我的生活更美好,我想避免输入密码来关闭计算机。我认为我可以寻找以下可能性:
- 允许执行命令
shutdown
而不提示 sudo 权限。(sudoers 文件等……?) - 找到一种方法来授予脚本 sudo 权限,以便我可以将 sudo 放到那里。
第一种方法可能更简单,而且在我的私人机器上我可以这样做。但是我想知道如果我遇到另一种情况该怎么办。虽然这只是理论上的,但我想学习最佳实践。
我想知道是否最好为编写的特定脚本授予权限,从而知道它做什么和不做什么,而不是删除完整命令的 sudo 密码保护(在这种情况下shutdown
。这可能吗?
同样,在这种情况下,我想我必须考虑通过操纵脚本进行代码注入的可能性。因此,我想我应该将所有者和组更改为 root,只允许执行,但不授予其他用户的读写访问权限。
(或者只是为了更具体的解决方案,只针对组。)但是,如果有人用自己的部分文件交换整个文件并因此获得 sudo 权限,那怎么办呢?
答案1
首先:你几乎肯定是在浪费自己的努力。
shutdown
阅读系统的手册页:我见过的每个实现中时间参数都是强制性的。
如果你尝试在没有任何时间参数的情况下运行,shutdown -h
它会对你大喊:
[mgraziano@monitor ~]$ sudo shutdown -h
Password:
usage: shutdown [-] [-h | -p | -r | -k] [-o [-n]] time [warning-message ...]
不过要回答你的问题:
选项1:允许执行关机命令而不提示 sudo 权限
要么明确允许使用选项关机NOPASSWD
(阅读man sudoers
信息),要么将您的用户添加到允许运行关机的组(通常operator
)。
选项 2:找到一种方法来授予脚本 sudo 权限,以便我可以将 sudo 放到那里。
您不能按照自己的想法去做,因为sudo
这样做行不通 - 权限是授予用户的。
您能做的最好的事情就是允许使用 运行脚本sudo
,但这与选项 1 相比没有任何好处(而且正如您所提到的,这会给您的脚本带来一些可能的安全漏洞,因为您允许它以 root 身份运行)。