我需要在没有密码的情况下以sudo的身份运行某些内容,因此我使用了visudo并将其添加到我的sudoers文件中:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program


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

#1 楼

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

完成此操作后,sudo会正常提示除/path/to/my/program之外的所有命令输入密码,它将始终使您无需运行要求输入密码。

评论


如果/ path / to / my / program是python脚本,这是否仍然有效?

–sadmicrowave
2014年3月3日20:29在

该程序可以改为为bash设置别名(即在.bashrc中)吗?甚至/ usr / local / sbin中的shell脚本?尝试。

– Nikos Alexandris
16年8月5日在16:11



Nikos-不,它不能是别名。它必须指向一条真实的道路。

– Paul Hedderly
19年1月31日在10:14

sudoers?哪里?喜用您的答案(

–Vasilii Suricov
19年4月10日在14:07

@VasiliiSuricov:通常在/ etc中,但是某些系统将其放在其他地方。如果找不到,请尝试使用man sudoers。在为该系统构建sudo时,应将该文件的本地位置替换到手册页中。

–沃伦·杨(Warren Young)
19-4-10在14:20



#2 楼

如果/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)。

评论


ex可以通过sudo su从jhon扎根-> john ALL =(ALL)NOPASSWD:/ bin / su

– Bortunac
2014年7月13日14:05



@adrian如果要允许任意命令作为root用户,则使john ALL =(ALL)NOPASSWD:all。通过su没有意义。

–吉尔斯'所以-不再是邪恶的'
14年7月13日在14:08

问题:为了安全起见,我是否应该更改外壳程序脚本的权限,以便只能由root用户对其进行修改和读取?我正在考虑攻击者修改脚本,该脚本无需授予密码即可授予所有权限,从而可以执行他/她想要的操作。显然,攻击者甚至无法读取sudoers文件来了解哪些脚本具有该特权,但是一旦他/她找到了存储它们的文件夹,便可以尝试使用我的所有自定义脚本,以希望它们被允许或类似的东西。

– Jeffrey Lebowski
17-10-10在18:13



@JeffreyLebowski如果您有一个(直接或间接)运行脚本的sudo规则,那么至关重要的是只有root用户(或始终具有root特权的人)才能写入脚本文件,包含脚本文件的目录以及其父目录等等。没关系,任何人都可以读取脚本文件(除非它包含密码或其他内容,但这不是一个好主意,如果有密码,则应将其保存在自己的文件中,否则存在意外泄漏该脚本的风险,例如将代码的该部分复制粘贴到此站点的问题中)。

–吉尔斯'所以-不再是邪恶的'
17-10-10在18:51

@alper否。很少需要重启。更改sudoers之后,您无需执行任何特殊操作:sudo每次都会对其进行检查。

–吉尔斯'所以-不再是邪恶的'
19年3月18日在19:02

#3 楼


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

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



创建一个新的脚本文件(用您想要的脚本名称):

vim ~/create_dir.sh


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


添加一些仅create_dir.shroot用户可以像在根目录级别上创建文件夹一样执行:保存并退出(使用sudo


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

mkdir /abc



进行更改,以便说明该脚本不需要密码。



打开sudo文件:

sudo chmod u+x create_dir.sh



在末尾添加以下行:

sudo visudo -f /etc/sudoers


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




现在,当运行命令时,在其前面添加sudoers,例如: />这将在脚本文件中运行命令,而无需输入密码。


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

评论


如果您在此处提供了相关步骤,并且将该链接用作更多详细信息的备份,那将更好。这样,即使该链接不再有效,您的答案仍会保留可能的价值。

–安东
2013年9月14日下午5:37

这个建议是不安全的。 sudo chmod u + x create_dir.sh的sudo部分是不必要的,因为用户(大概)拥有其主目录的所有权。由于用户可以写入create_dir.sh,因此您实际上已经为该用户提供了免费的root shell。

– Lekensteyn
2014年7月19日在8:36

@Lekensteyn这也意味着以用户身份运行的任何程序。也可以只允许用户使用sudo运行任何操作而无需输入密码。

–pydsigner
16年5月23日在1:41

我想念什么吗?我相信整个chmod都是不必要的,因为您依靠sudo来提升特权。

– G-Man说“恢复莫妮卡”
18年6月13日在14:57

#4 楼

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

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


评论


(ALL)部分是可选的,省去它具有完全相同的效果。尽管拥有(root)会更好,但是缺少它并不能解释问题。

–吉尔斯'所以-不再是邪恶的'
2011年5月12日晚上11:39

该命令的sudo +1,仅此而已!没有理由破坏整个系统...

–约翰
2011年5月12日在11:40

@Johan:那已经是问题了。

–吉尔斯'所以-不再是邪恶的'
2011年5月12日在12:13

#5 楼

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

评论


哇,我之前从未听说过这种解决方案

–某事
18年10月10日在14:18

为什么我需要滚动到这些内容的底部才能找到最佳答案?感谢您提供此简单的安全解决方案。

– RyanNerd
19年5月12日在19:12

@RyanNerd:这不是一个安全的解决方案。现在,OP不仅可以以root用户身份运行该命令而无需输入密码,而且购买任何人现在都可以以root用户身份运行该命令。

– Ethan Furman
20年2月7日在16:36

“ chmod 4775文件名”是一种方法。其次,也许在不重新定义整个文件权限的情况下更好的SETUID方法是“ chmod u + s filename”

– 16851556
20-2-9在11:12



sudo chmod 005是安全的。您不想将写入权限授予当前用户。否则,您会话中的任何人都可以对脚本执行任何操作。

– Adrian Lopez
20 Sep 9 '13:01



#6 楼

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

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


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

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

%group ALL=(ALL) NOPASSWD: ALL


或忽略用户身份验证

youruser ALL=(ALL) NOPASSWD: ALL


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

#7 楼

验证sudo是否没有别名。像这样运行

/usr/bin/sudo /path/to/my/program


例如,这样的shell别名: 。

评论


您是正确的,我的评论在这里混乱了,对此表示抱歉。尽管如此,我还是很感兴趣-您如何期望别名会改变sudo对sudoer的处理。或者您是在谈论将sudo重定向到始终会打印此错误消息以获取密码的内容?这里不太可能...

–彼得
14年7月19日在8:18

我遇到了与OP相同的问题。原来是我的〜/ .bashrc中有别名sudo =“ sudo env PATH = $ PATH”引起的。我提交的答案不仅是为自己解决问题,也只是盲目地从事我的业务,​​它是针对该主题的其他任何人的可能解决方案。

– Sepero
2014年7月19日在22:50



很好,但是当它不明显时(在这种情况下,至少对某些人来说不是),最好在答案中添加一个解释,以提供一些背景信息并防止人们盲目地使用魔术咒语。 +2(-(-1)+ +1)。 :)

–彼得
2014年7月24日在22:45

#8 楼

执行脚本时,需要以sudo /path/to/my/script的身份运行它。

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

您还可以考虑将gtk-sudo用作可视密码提示。应该考虑一下这样的想法:您不应该以root身份运行事物,并且在更远的地方更改系统以完全不需要root权限将是一个更好的方法。

评论


不要将shell脚本设为setuid。请参阅在shell脚本上允许setuid。

–吉尔斯'所以-不再是邪恶的'
2011年5月12日晚上11:38

我考虑不提它,因为这是一个糟糕的选择。我只是删除了它,因为我担心这个提问者可能会使用该建议,即使警告它是一个坏建议!

–卡莱布
11年5月12日在11:41

#9 楼

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

我正在调用的脚本位于/usr/bin中,我对该目录没有写权限尽管我通常可以在那里读取任何文件)。该脚本使用+ x(可执行的权限)进行了修改,但仍然无法正常运行。将此文件移动到我的主目录中的路径而不是/usr/bin,我终于能够使用sudo调用它而无需输入密码。需要以sudo运行脚本。调用脚本时键入sudo。请勿在脚本中实际需要root用户的命令中使用sudo(在我的情况下,更改键盘背光)。也许这也可行,但是您不需要这样做,这似乎是一个更好的解决方案。

评论


第二段回答了我的问题

–艾哈迈德·扎法尔(M. Ahmad Zafar)
2013年9月13日在8:02

@MuhammadAhmadZafar很高兴它有所帮助!

–吕克
2013年9月13日上午10:53

如果您具有适当的权限(在sudoers中设置),可以在没有密码的情况下运行所讨论的命令,那么实际上可以在脚本内部使用sudo很好。它使事情更加安全。

–彼得
2014年7月19日在8:21

确实可以将此答案改写为逐步的“这是您的操作方式”,而不是与其他答案进行对话

–海象猫
17年11月28日在22:31

@WalrustheCat好点。重新阅读我的答案,我想我自己可能有些困惑。但是现在,我不记得确切的情况了,因此我无法真正编写出更好的文章。如果您找出答案,也许是几个答案的组合,一定要提交一个新答案!

–吕克
17年11月29日在7:24

#10 楼

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

super /path/to/your/script



运行脚本,如果要运行一些二进制可执行文件(例如,您已经从某些C源代码将其编译为ELF二进制代码(不是脚本)作为根,则可以考虑将其设置为setuid(实际上/bin/login/usr/bin/sudo/bin/susuper都使用该技术)。但是,请务必小心,您可能会打开一个巨大的安全漏洞。

具体来说,您的程序应进行偏执式编码(因此,在“采取行动”之前,请检查所有参数以及环境和外部条件,并假设可能存在敌意)用户),那么您可以仔细使用seteuid(2)和朋友(另请参阅setreuid(2))(另请参阅功能(7)和凭据(7)和execve(2)...)

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

但是要非常小心。 ,在编写此类代码之前。但是您可以使用C语言编写一个小的setuid-binary包装程序。

#11 楼

理想情况下,如果要自定义可以通过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命令中,都会提示您输入密码。可视化。请记住,文件名和规则在文件中的顺序非常重要,无论是比先前的条目允许更多或更少的允许,最后装入的都是获胜的。


您可以通过使用00-99或aa / bb / cc前缀来控制文件名的顺序,但是请记住,如果您有任何不带数字前缀的文件,它们将在编号文件后加载,覆盖设置。这是因为,根据语言设置的不同,shell会首先使用排序数字,然后按“升序”排序时可能会交错使用大写和小写字母。 NOPASSWD查看当前语言是否打印%groupyouarein ALL=(ALL) ALL等或printf '%s\n' {{0..99},{A-Z},{a-z}} | sort,然后printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort确定使用的最佳“最后”字母前缀是什么。

#12 楼

要允许任何用户以sudo身份执行程序而无需询问密码,您可以在%sudo ALL=(root) NOPASSWD: /path/to/your/program

中添加以下行

/etc/sudoers

请注意,%sudo使其成为。

评论


尽管这是完成sudo规则的一种方法,但它无法回答有关为什么在此规则上设置NOPASSWD标志仍会导致出现密码提示的问题。有关为什么会发生的想法,请参见已接受的答案。

– Jeff Schaller♦
19 Mar 2 '19 at 17:19

#13 楼

以下是仅当命令具有一组特定选项(部分选项是可变的)时才希望运行不带密码的命令的情况。 AFAIK无法在sudoers声明中使用变量或值范围,即,您可以使用以下命令显式访问command option1,但不能显式访问command option2user_name ALL=(root) /usr/bin/command option1,其中command option1 value1可能有所不同,您需要为value1的每个可能值具有明确的sudoers行。 Shell脚本提供了一种解决方法。

这个答案的灵感来自M. Ahmad Zafar的答案,并在那里解决了安全问题。


创建一个Shell脚本,其中您可以在不使用value1的情况下调用该命令。
使用visudo将异常添加到sudoers中:

sudo

运行脚本/usr/local/bin/

例如,我想更改在macOS上显示睡眠超时。这是通过以下方式完成的:

chown root:wheel /usr/local/bin/script_name

我认为更改睡眠超时是一种无辜的举动,不能证明麻烦输入密码,但是chmod 755 /usr/local/bin/script_name可以做很多事情想要将其他内容保留在sudo密码后面。

所以我在user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name处具有以下脚本: > sudo script_name

sudo pmset displaysleep time_in_minutes文件的末尾,我有以下行:

pmset

将超时设置为3分钟,我是从普通用户帐户/usr/local/bin/ds运行脚本的:

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

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

 sudoers 


#14 楼

您也可以使用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


#15 楼

在/ etc /内的脚本sudoers中,取消注释以下行: 。
像所有用户一样以root用户身份
#!/bin/bash
ALL    ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root

这是具有root权限运行脚本的最安全方法。