visudo
并将其添加到我的sudoers
文件中: MYUSERNAME ALL = NOPASSWD: /path/to/my/program
为什么要求输入密码?如何以root用户身份与非root用户一起运行/使用命令,而无需输入密码?
#1 楼
您在sudoers
文件中有另一个条目,通常位于/etc/sudoers
,它也与您的用户匹配。 NOPASSWD
规则必须位于该规则之后才能优先。完成此操作后,
sudo
会正常提示除/path/to/my/program
之外的所有命令输入密码,它将始终使您无需运行要求输入密码。#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.sh
或root
用户可以像在根目录级别上创建文件夹一样执行:保存并退出(使用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/su
和super
都使用该技术)。但是,请务必小心,您可能会打开一个巨大的安全漏洞。具体来说,您的程序应进行偏执式编码(因此,在“采取行动”之前,请检查所有参数以及环境和外部条件,并假设可能存在敌意)用户),那么您可以仔细使用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 option2
: user_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权限运行脚本的最安全方法。
评论
如果/ 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