以 sudo 形式安全执行自定义脚本部分

以 sudo 形式安全执行自定义脚本部分

/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 身份运行)。

相关内容