it-swarm.cn

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

我需要在不使用密码的情况下以Sudo的身份运行某些东西,因此我使用visudo并将其添加到我的sudoers文件中:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

然后我尝试了一下:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

为什么要求输入密码?如何以root用户身份与非root用户一起运行/使用命令,而无需输入密码?

175
LanceBaynes

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

完成此操作后,Sudo通常会为除/path/to/my/program,它将始终让您无需输入密码即可运行。

97
Warren Young

如果/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中有/etc/sudoers,或者此选项是编译时的默认值(Sudo sudo -V | grep env应包括Reset the environment to a default set of variables)。

139

[〜#〜]警告[〜#〜]:此答案被认为是不安全的。见下面的评论

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

  1. 创建一个新的脚本文件(替换create_dir.sh和所需的脚本名称):

    vim ~/create_dir.sh
    

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

  2. 添加一些仅rootSudo用户可以执行的命令,例如在根目录级别创建文件夹:

    mkdir /abc
    

    注意:请勿在这些命令中添加Sudo。保存并退出(使用:wq!

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

    Sudo chmod u+x create_dir.sh
    
  4. 进行更改,以使该脚本不需要密码。

    1. 打开sudoers文件:

      Sudo visudo -f /etc/sudoers
      
    2. 在末尾添加以下行:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

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

  5. 现在,在运行命令时,在其前面添加Sudo,如下所示:

    Sudo ./create_dir.sh
    

    这将在脚本文件中运行命令,而无需输入密码。

请遵循此处提到的简单步骤 http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

我认为您的语法有误。至少我使用以下对我有用的东西:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

如果要避免使用Sudo或不必更改sudoers配置文件,可以使用:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

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

6
linuxgnuru

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

该文件是:

Sudo cat /etc/sudoers.d/10-installer

唯一的查看方法是在root用户特权下,如果没有该目录,您将无法列出该目录,该文件是Manjaro特有的,您可能会在其他目录中找到该配置的其他名称。

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

忽略组的身份验证

%group ALL=(ALL) NOPASSWD: ALL

或忽略用户的身份验证

youruser ALL=(ALL) NOPASSWD: ALL

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

youruser ALL=(ALL) NOPASSWD: /path/to/executable

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

5
Lyoneel

验证Sudo是否没有别名。这样跑

/usr/bin/Sudo /path/to/my/program

例如,像这样的Shell别名:

alias Sudo="Sudo env PATH=$PATH"

可能会导致这种行为。

4
Sepero

这为我解决了这个问题(也尝试了其他一些答案,可能会有所帮助):

我正在调用的脚本位于/usr/bin,我没有写权限的目录(尽管我通常可以在其中读取任何文件)。该脚本是+ x(可执行的权限),但是仍然无法正常工作。将此文件移到我的主目录中的路径,而不是/usr/bin,我终于可以使用Sudo调用它而无需输入密码。

我也对此有所怀疑(为以后的读者澄清):您需要以Sudo身份运行脚本。当调用脚本时,键入Sudo。请勿在脚本中实际需要root的命令中使用Sudo(在我的情况下,更改键盘背光)。也许这也可行,但是您不需要这样做,这似乎是一个更好的解决方案。

2
Luc

执行脚本时,您需要以Sudo /path/to/my/script

编辑:根据您对另一个答案的评论,您希望通过图标运行它。您将需要创建一个.desktop文件,使用Sudo执行您的程序,就像在终端上一样。

您也可以考虑使用gtk-Sudo提示输入视觉密码。

您可能应该考虑这样一种想法,即您不应该以root身份运行事物,并且在更远的地方更改系统以使您根本不需要root权限将是一个更好的方法。

2
Caleb

另一种可能是安装,配置,然后使用 super 命令以

super /path/to/your/script

如果您想运行一些二进制 executable (例如,您已经从某些C语言编译为 [〜#〜] elf [〜#〜] 二进制)源代码)-这是not一个脚本-作为根,您可以考虑使其成为 setuid(实际上/bin/login/usr/bin/Sudo/bin/susuper都在使用该技术)。但是,请非常小心,您可能会打开一个巨大的安全漏洞

具体来说,您的程序应该是偏执的编码(因此,在“执行”之前,请检查所有参数以及环境和外部条件,假设用户可能是敌对用户),则可以使用 seteuid(2) 和朋友(另请参阅 setreuid(2) )(另请参阅 功能(7)凭证(7)execve(2) ...)

安装此类二进制文件时,将使用chmod u+s(读取 chmod(1) )。

但是要非常小心.

在进行编码之前,请阅读有关setuid的许多知识,包括 Advanced Linux Programming

请注意,脚本或任何 Shebang 版本的东西都不能设置为uid。但是您可以(用C语言)编写一个小的setuid-binary包装它。

1
Basile Starynkevitch

理想情况下,如果要自定义可以通过Sudo运行的命令,则应在_/etc/sudoers.d/_下的单独文件中进行这些更改,而不是直接编辑sudoers文件。您还应该始终使用visudo编辑文件。您切勿在NOPASSWD个命令上授予ALL

示例:_Sudo visudo -f /etc/sudoers.d/mynotriskycommand_

插入您的线路授予权限:_myuser ALL= NOPASSWD: /path/to/your/program_

然后保存并退出,如果您有任何语法错误,visudo会警告您。

您可以运行_Sudo -l_来查看已授予您的用户的权限,如果在输出中出现任何%groupyouarein ALL=(ALL) ALL命令之前出现任何特定于用户的NOPASSWD命令,则会提示您输入您的密码。

如果您发现自己创建了许多此类sudoers.d文件,则可能需要创建按用户命名的文件,以便于查看。请记住,文件名和规则在文件中的顺序非常重要,无论是比先前的条目允许更多或更少的允许,最后装载的都是获胜的。

您可以使用00-99或aa/bb/cc前缀来控制文件名的顺序,但是请记住,如果您有任何不带数字前缀的文件,它们将在编号文件之后加载,覆盖设置。这是因为,根据语言设置的不同,命令行管理程序会先使用“词法排序”对数字进行排序,然后在按“升序”排序时可能会插入大小写。

尝试运行_printf '%s\n' {{0..99},{A-Z},{a-z}} | sort_和_printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort_,以查看您当前的语言是先打印AaBbCc等还是ABC然后再打印abc,以确定最佳的“最后一个”字母要使用的前缀。

0
dragon788

或者,您可以使用python pudo 软件包。

安装:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

以下是用于在python)自动化下以root权限运行命令的代码片段:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

以下是在root特权下运行命令的cmd示例:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0
Madhusudhan Kasula

要允许任何用户以Sudo身份执行程序而无需询问密码,您可以添加以下行

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

/etc/sudoers

注意%Sudo完成。

0
ultimatex

以下是您要仅在命令具有一组特定选项(部分选项是可变的)的情况下运行不带密码的命令的情况。 AFAIK无法在sudoers声明中使用变量或值范围,即,您可以使用以下方式显式访问_command option1_,但不能访问_command option2_:

user_name ALL=(root) /usr/bin/command option1

但是,如果结构为_command option1 value1_,其中_value1_可能有所不同,则您需要为_value1_的每个可能值使用显式的sudoer行。 Shell脚本提供了一种解决方法。

该答案的灵感来自艾哈迈德·扎法尔(M. Ahmad Zafar)的答案,并在那里解决了安全问题。

  1. 创建一个Shell脚本,在其中调用不带Sudo的命令。
  2. 将脚本保存在具有root权限的文件夹中(例如_/usr/local/bin/_),将文件设为root所有者(例如_chown root:wheel /usr/local/bin/script_name_),而其他用户则没有写访问权限(例如_chmod 755 /usr/local/bin/script_name_)。
  3. 使用visudo将异常添加到sudoers中:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name

  4. 运行您的脚本_Sudo script_name_。

例如,我想更改macOS上的显示睡眠超时。使用以下命令完成此操作:

_Sudo pmset displaysleep time_in_minutes_

我认为更改睡眠超时是一个无辜的举动,它不能证明输入密码的麻烦,但是pmset可以做很多事情,我想将这些其他事情保留在Sudo密码后面。

所以我在_/usr/local/bin/ds_有以下脚本:

_#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi
_

sudoers文件的末尾,有以下行:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

要将超时设置为3分钟,我从普通用户帐户_user_name_运行脚本:

_Sudo ds 3_

PS我的大部分脚本都是输入验证,这不是强制性的,因此以下内容也可以工作:

_#!/bin/bash
pmset displaysleep $1 
_
0
Koit Saarevet