如何在没有密码提示的情况下以 root 身份运行特定程序?

Lan*_*nes 205 sudo

我需要在没有密码的情况下以 sudo 的形式运行一些东西,所以我使用visudo并将其添加到我的sudoers文件中:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program
Run Code Online (Sandbox Code Playgroud)

然后我试了一下:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 
Run Code Online (Sandbox Code Playgroud)

为什么它要求输入密码?如何在不要求密码的情况下以非 root 用户身份以 root 身份运行/使用命令?

Gil*_*il' 163

如果 中有多个匹配条目/etc/sudoers,则 sudo 使用最后一个。因此,如果您可以在有密码提示的情况下执行任何命令,并且希望能够在没有密码提示的情况下执行特定命令,那么您需要最后一个例外。

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program
Run Code Online (Sandbox Code Playgroud)

请注意使用(root), 以允许程序以 root 身份运行,但不能以其他用户身份运行。(除非您已经考虑到影响,否则不要授予超过最低要求的权限。)

未运行 Ubuntu 或更改了默认 sudo 配置(Ubuntu 的 sudo 默认可以)的读者请注意:以提升的权限运行 shell 脚本有风险,您需要从干净的环境开始(一旦 shell 启动,为时已晚(请参阅在 shell 脚本上允许 setuid),因此您需要 sudo 来处理此问题)。确保您有Defaults env_resetin/etc/sudoers或此选项是编译时默认值(sudo sudo -V | grep env应包含Reset the environment to a default set of variables)。

  • @adrian 如果您想以 root 身份允许任意命令,请设置为 `john ALL=(ALL) NOPASSWD: all`。通过 `su` 没有意义。 (6认同)
  • ex 使用 sudo su 从 jhon 进入 root 并且没有通过 -----> john ALL=(ALL) NOPASSWD: /bin/su (3认同)
  • @alper 不。很少有事情需要重新启动。改变 `sudoers` 后,你不需要做任何特别的事情:`sudo` 每次都会检查它。 (2认同)

War*_*ung 114

您在sudoers文件中有另一个条目,通常位于/etc/sudoers,它也与您的用户匹配。NOPASSWD规则必须在该规则之后,才能优先。

完成此操作后,sudo通常会为除 之外的所有命令提示输入密码/path/to/my/program,它始终让您无需输入密码即可运行。

  • 如果`/path/to/my/program` 是一个python 脚本,这仍然有效吗? (8认同)
  • Nikos - 不,它不能是别名。它必须指向一条真实的路径。 (2认同)

小智 27

警告:此答案已被视为不安全。请参阅下面的评论

完整的解决方案:以下步骤将帮助您实现所需的输出:

  1. 创建一个新的脚本文件(替换create_dir.sh为您想要的脚本名称):

    vim ~/create_dir.sh
    
    Run Code Online (Sandbox Code Playgroud)

    该脚本将在用户的主目录中创建

  2. 添加一些只有 arootsudo用户才能执行的命令,例如在根目录级别创建文件夹:

    mkdir /abc
    
    Run Code Online (Sandbox Code Playgroud)

    注意:不要添加sudo到这些命令中。保存并退出(使用:wq!

  3. 使用以下命令为其分配执行权限:

    sudo chmod u+x create_dir.sh
    
    Run Code Online (Sandbox Code Playgroud)
  4. 进行更改,以便此脚本不需要密码。

    1. 打开sudoers文件:

      sudo visudo -f /etc/sudoers
      
      Run Code Online (Sandbox Code Playgroud)
    2. 在最后添加以下行:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      
      Run Code Online (Sandbox Code Playgroud)

      替换ahmad为您的用户名。还要确保这是最后一行。保存并退出。

  5. 现在在运行命令sudo之前添加时,例如:

    sudo ./create_dir.sh
    
    Run Code Online (Sandbox Code Playgroud)

    这将在不要求密码的情况下运行脚本文件中的命令。

按照这里提到的简单步骤http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

  • 这个建议是不安全的。`sudo chmod u+x create_dir.sh` 的 `sudo` 部分是不必要的,因为用户(大概)拥有他/她的主目录的所有权。由于用户可以写入`create_dir.sh`,您实际上已经为该用户提供了一个免费的root shell。 (19认同)
  • 我错过了什么吗?我相信整个 `chmod` 是不必要的,因为你依赖 `sudo` 来提升你的权限。 (2认同)

mus*_*iKk 12

我认为你的语法是错误的。至少我使用以下对我有用的方法:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
Run Code Online (Sandbox Code Playgroud)

  • `(ALL)` 部分是可选的,省略它具有完全相同的效果。拥有`(root)` 会更好,但它的缺失并不能解释问题。 (7认同)
  • @Johan:这已经在问题中了。 (3认同)

小智 11

如果您想避免使用 sudo 或更改 sudoers 配置文件,您可以使用:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME
Run Code Online (Sandbox Code Playgroud)

这将使命令以 root 身份运行而无需 sudo。

  • @RyanNerd:这不是一个安全的解决方案。OP 现在不仅可以在没有密码的情况下以 root 身份运行命令,而且现在任何人都可以以 root 用户身份运行命令。 (2认同)
  • “chmod 4775 文件名”是一种方法。其次,也许更好的方法是 [SETUID](https://en.wikipedia.org/wiki/Setuid#When_set_on_an_executable_file),无需重新定义整个文件权限,即“chmod u+s filename” (2认同)

Lyo*_*eel 5

如果您有像 Manjaro 这样的发行版,您必须首先处理一个覆盖 /etc/sudoers 定义的文件,您可以删除它或直接使用该文件添加新配置。

这个文件是:

sudo cat /etc/sudoers.d/10-installer
Run Code Online (Sandbox Code Playgroud)

查看它的唯一方法是在 root 权限下,没有它你不能列出这个目录,这个文件是 Manjaro 特定的,你可能会发现这个配置有其他名称,但在同一目录中。

在您选择的文件中,您可以添加以下行以获得所需的配置:

忽略组的身份验证

%group ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

或忽略用户的身份验证

youruser ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

或忽略对特定用户的可执行文件的身份验证

youruser ALL=(ALL) NOPASSWD: /path/to/executable
Run Code Online (Sandbox Code Playgroud)

快速说明:您正在打开一扇门,无需身份验证即可使用 SUDO,这意味着您可以运行所有内容,修改系统中的所有内容,并负责任地使用它。