我如何“sudo -i”特定命令

gil*_*asm 5 root sudo

我需要像 sudo -i 一样在没有密码的情况下运行 important_script.sh。

如果我有 sudoers:

apache ALL = (root) NOPASSWD:    /blah/important_script.sh
Run Code Online (Sandbox Code Playgroud)

并运行“sudo /blah/important_script.sh”我可以在没有密码的情况下运行它。

但是,如果我运行“sudo -i /blah/important_script.sh”,我需要输入 apache 的密码。

如果我将 sudoers 中的行更改为:

apache ALL = (root) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

我可以在没有密码的情况下运行命令“sudo -i /blah/important_script.sh”。

但我希望只能运行 /blah/important_script.sh,而不是所有命令。

那么,我如何设置只有 /blah/important_script.sh 可以在没有密码的情况下使用 sudo -i 运行。

use*_*517 9

当我尝试这个时,我收到一条错误消息,它提供了问题的线索

 Sorry, user bob is not allowed to execute '/bin/bash -c /blah/important_script.sh' as root on host.
Run Code Online (Sandbox Code Playgroud)

请注意,我们被拒绝访问与/bin/bash -c...我们在 sudoers 文件中指定的命令不同的命令/blah/important_script...。当您告诉 sudo 允许用户运行特定命令时,他们必须使用 sudoers 中指定的确切命令行,因此我们需要适当地更改 sudoers。

bob   ALL=(root) NOPASSWD: /bin/bash -c /blah/important_script.sh
Run Code Online (Sandbox Code Playgroud)

这现在适用于鲍勃

$ sudo -i /bin/bash -c /blah/important_script.sh
Run Code Online (Sandbox Code Playgroud)

那么它为什么要这样做呢?那么 sudo 的手册页有答案

?i [命令] ?i(模拟初始登录)选项运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,它将通过 shell 的 ?c 选项传递给 shell 以执行。如果未指定命令,则执行交互式 shell...