![如何在没有密码提示的情况下以 root 身份运行特定程序?](https://linux22.com/image/17428/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B2%A1%E6%9C%89%E5%AF%86%E7%A0%81%E6%8F%90%E7%A4%BA%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BB%A5%20root%20%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E7%89%B9%E5%AE%9A%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我需要在没有密码的情况下以 sudo 方式运行某些内容,因此我使用了visudo
它并将其添加到我的sudoers
文件中:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program
然后我尝试了一下:
$ sudo /path/to/my/program
[sudo] password for MYUSERNAME:
为什么它要求输入密码?如何以非 root 用户身份以 root 身份运行/使用命令,而不要求输入密码?
答案1
如果 中存在多个匹配条目/etc/sudoers
,则 sudo 使用最后一个。因此,如果您可以在有密码提示的情况下执行任何命令,并且希望能够在没有密码提示的情况下执行特定命令,则最后需要例外。
myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program
请注意使用(root)
, 允许程序以 root 身份运行,但不能以其他用户身份运行。 (除非您已经考虑到其含义,否则不要授予超过所需最低权限的权限。)
未运行 Ubuntu 或更改了默认 sudo 配置的读者请注意(Ubuntu 的 sudo 默认情况下是可以的):以提升的权限运行 shell 脚本是有风险的,您需要从干净的环境开始(一旦 shell 启动,就为时已晚(请参阅允许在 shell 脚本上设置 setuid),所以你需要 sudo 来处理这个)。确保您有Defaults env_reset
in/etc/sudoers
或此选项是编译时默认选项(sudo sudo -V | grep env
应包含Reset the environment to a default set of variables
)。
答案2
您还有另一个条目sudoers
文件,通常位于/etc/sudoers
,它也与您的用户匹配。该NOPASSWD
规则需要位于该规则之后才能使其优先。
完成此操作后,sudo
通常会提示输入除 之外的所有命令的密码/path/to/my/program
,它总是让您运行而无需询问密码。
答案3
警告:这个答案被认为是不安全的。请参阅下面的评论
完整的解决方案:以下步骤将帮助您实现所需的输出:
创建一个新的脚本文件(替换
create_dir.sh
为您想要的脚本名称):vim ~/create_dir.sh
该脚本将在用户的主目录中创建
root
添加一些只有用户才能执行的命令,sudo
例如在根目录级别创建文件夹:mkdir /abc
笔记:不要添加
sudo
到这些命令中。保存并退出(使用:wq!
)使用以下命令为其分配执行权限:
sudo chmod u+x create_dir.sh
进行更改以使该脚本不需要密码。
打开
sudoers
文件:sudo visudo -f /etc/sudoers
在末尾添加以下行:
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
替换
ahmad
为您的用户名。还要确保这是最后一行。保存并退出。
现在,当运行命令时,
sudo
在它之前添加:sudo ./create_dir.sh
这将运行脚本文件内的命令,而不要求输入密码。
请按照此处提到的简单步骤进行操作http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
答案4
我认为你的语法是错误的。至少我使用以下对我有用的方法:
myusername ALL=(ALL) NOPASSWD: /path/to/executable