我有一个带有一堆命令的 shell 脚本,其中一个需要 root。我想在不输入密码的情况下执行脚本:无论是在脚本之前还是在执行过程中。我怎样才能做到呢?
答案1
sudo 是一种常见的做法,用于向某些用户授予权限。
一个包含多个命令的简单示例:我希望用户 nagios 使用特定命令来转储信息。
nagios ALL=(root) NOPASSWD: /usr/bin/dmidecode, /bin/netstat -ntp
再比如,你管理多台服务器,你想部署相同的服务器 苏多尔斯每个上的文件。并且该规则仅在一台服务器上有效。
nagios srvpeug1208 =(root) NOPASSWD: /usr/bin/dmidecode, /bin/netstat -ntp
这将允许 nagios 开启srvpeu1208执行一些命令。
答案2
正如其他人所提到的,您的脚本需要的关键是以 root 身份运行需要 root 权限的命令,而不需要密码提示。
这是 *nix 中的一个常见问题,当用户需要运行通常需要 root 权限的特定命令,但我们通常不想授予该用户 root 权限时。
Unix对此有一个通用的解决方案:setuid 位。当在二进制文件上设置/启用 setuid 位时,该二进制文件将始终作为文件所有者运行(因此,如果可执行文件的所有者是 root,它将作为 root 执行)。
要设置此权限,请确保需要 root 权限的二进制文件由 root 拥有,然后将其权限设置为包含 setuid 位:
sudo chown root /path-to-binary
sudo chmod 4755 /path-to-binary
该二进制文件现在将以 root 身份执行,无需调用用户提供密码。请注意,如果您有 shell 脚本而不是二进制文件,则需要使用此处描述的解决方法为什么 setuid 不起作用?
无论访问该文件的用户如何,这都会起作用,因此请小心。如果您想将此功能仅限于一个特定用户,那么您可以按照其他人的建议修改 sudoers 配置。
答案3
一些选项:
- 阅读
man sudoers
,并使用 sudo 注册脚本,因为您不需要密码即可运行。请仔细阅读 visudo 上的内容(以及如何不让自己被锁定)。如果不这样做,当 sudo 不起作用时,您将回到这里询问如何编辑文件。 - 重新写入
golang
并使用 setuid 位。