如何在不需要密码的情况下使用sudo运行应用程序?

...但仍然需要对需要管理员权限的应用程序进行授权?

为了允许以下操作:

$ apache2ctl restart
httpd not running, trying to start
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

$ sudo !!
sudo apache2ctl restart             #no password asked
$                                   #works!

参考一下,我在亚马逊的E3实例上见过这个设置。

有任何想法吗?


这是一个在论坛上的很棒的教程,详细介绍了创建一个单独的文件来指定你常用的程序。出于安全考虑,这是一个很好的主意。 - Todd Partridge 'Gen2ly'
6个回答

你需要编辑sudoers文件。请注意,成功会使系统变得不太安全,而失败可能会破坏sudo。 始终使用sudo visudo来编辑sudoers文件,因为visudo会检查错误,并且如果发现任何错误,将不保存文件。
给所有东西都允许以root身份运行而无需密码是一个不好的主意,所以只允许通过一个可执行文件(apache2ctl);将以下内容追加到文件的最底部:
YOURNAME ALL = NOPASSWD: /usr/bin/apache2ctl

您可以选择将可执行文件的路径替换为"ALL",这样您就可以完全无需密码使用sudo。
将YOURNAME替换为您的用户名,按下Ctrl + X保存并退出。如果发生错误,它将提供还原、编辑或无论如何保存的选项。 确保您使用可执行文件的完整路径:
例如,使用/usr/bin/apache2ctl而不仅仅是apache2ctl。这很重要,因为如果不明确指定路径,sudo将允许以root身份运行用户当前路径上命名为apachectl的任何程序。

3请注意,%YOURNAME 将授予与您用户名相同的“组”权限,这通常不是问题,因为在 Ubuntu 系统上,每个普通用户都有一个同名的组。要将权限授予您的用户,请指定不带百分号的 YOURNAME - Daniel Werner
有没有办法更加限制性?(仅限执行功能的某些函数) - 3pic
1虽然这是一个旧帖子,但我肯定会通过限制sudoers条目的主机名(如果可能的话),并且要么限制给定的参数,要么不限制任何参数(按照apache2ctl的方式)来完善那个答案,就像这样:YOURNAME YOUR-HOSTNAME = NOPASSWD: /usr/bin/apache2ctl <specific arg | "">。--- 在所有情况下,man 5 sudoers是参考的首选。 - Cbhihe
@Cbhihe 我尝试了上述命令,但在使用参数时无法正常工作。你确定可以在Sudoers文件中设置args并运行程序吗?例如,我有一个SIP程序Asterisk。当我将条目添加为user hostname = (asterisk) NOPASSWD: /usr/sbin/asterisk -rx "pjsip show channelstat"时,它从未允许我运行该命令。只有当我添加了不带参数的/usr/sbin/asterisk时,程序才会运行,但这似乎是一种不好的做法,因为可以运行任何参数。 - Definity
@Definity,小心发表死后帖子,虽然在这种情况下,如果您发表了一个新问题,要避免重复可能会很困难....回答您的问题:使用完全限定的命令名称和参数是有充分文档支持的,我在各种基于Debian和Suse的操作系统上都使用它。我不确定的是您的问题是否与您使用的双引号有关。您可以尝试转义每个引号一次,如果不行再尝试两次,例如(针对后一种情况):user hostname = (asterisk) NOPASSWD: /usr/sbin/asterisk -rx \\"pjsip show channelstat\\"man 5 sudoers 是您的参考来源.... - Cbhihe
...并始终使用sudo visudo来编辑/etc/sudoers。没有例外。始终如此。 - Cbhihe
@Cbhihe 谢谢你的建议。这是我第一次听说“死贴”,我会避免在旧帖子上回复。 - Definity
@Definity:如果我猜得没错的话,你在处理双引号时遇到了问题,并且转义它们并不能解决。你可以将带有引用参数的完整命令放入一个可执行文件(例如一个sh脚本)中,并将该完全限定的可执行文件作为/etc/sudoers行中的命令使用。查看手册以了解如何使用哈希指纹来防止任何人篡改你的可执行文件内容... - Cbhihe

这个问题的真正答案可能会很复杂,因为sudo非常强大,并且可以配置做一些很酷的事情。这在文档中有详细解释。
简短的回答是在终端中运行sudo visudo。如果这是你第一次运行visudo,它会询问你喜欢使用哪个编辑器。nano通常被认为是最容易使用的,但选择你最熟悉/舒适的编辑器即可。你需要决定要给谁访问权限;可以是ALL代表所有人(这是一个非常糟糕的主意),一个用户或者一个系统组。组名前面加上%符号。例如,如果你想给steroid_users组中的每个人root权限,并且不需要输入密码执行所有命令,你可以添加以下内容:
%steroid_users ALL=(ALL) NOPASSWD: ALL

将文件滚动到末尾,退出并保存文件。如果一切顺利,而且您是steroid_users组的成员,您将能够无需输入密码发出sudo *some-command*命令。

请记住,任何在您登录时访问您的终端的人 -- 或者如果您设置了基于密钥的ssh身份验证,或者更糟糕的是启用了无密码会话登录 -- 都完全不受限制地访问您整个系统。如果您的系统上有多个用户,或者这是一个文件服务器,所有用户的文件都可能面临风险,因为root可以做任何事情!

此外,如果您犯了一个错误,visudo将输出错误消息并不保存对文件的更改。这将有助于防止完全破坏sudo。您应该真正阅读一下documentation。Sudo旨在为用户提供足够的访问权限来完成工作,而无需暴露整个系统。只为某些命令提供无密码访问可能是有利的。

希望这对您有所帮助。


没问题,我按照这个方法操作了一下,然后从http://askubuntu.com/questions/192050/how-to-run-sudo-command-with-no-password 使用了 "sudo service sudo restart" 命令,结果在我的Ubuntu会话中成功使用了所有这些功能。太棒了! - Patrick

你需要编辑'/etc/sudoers'文件(有一个'visudo'命令可以用来编辑)在允许的命令列表之前为你的用户或组添加NOPASSWD。 如果你的用户在'admin'组中 - 你需要以下操作:
%admin ALL=(ALL) NOPASSWD: ALL

请查看https://help.ubuntu.com/community/Sudoers,顺便说一句。


你可以在用户列表中添加nopasswd标志,但这并不能消除所有要求输入密码的问题。只有第一个问题会被要求输入密码。
1. 编辑sudoers文件:sudo visudo(你必须使用sudo。这是一个管理员文件)。 2. 在管理员行(最后一行)之后添加带有nopasswd标志的用户。 例如: cyrex ALL = NOPASSWD: ALL 或 cyrex ALL = (ALL) NOPASSWD: ALL。

sudo visudo
%<GROUP> ALL = NOPASSWD: apache2ctl

或者

sudo visudo
%<GROUP> ALL = NOPASSWD: /etc/init.d/apache2

我猜这样就可以了。
但是在删除sudo密码时要小心。

2在第一个示例中,出于安全原因,您应该指定绝对路径 -- 不诚实的用户可能会更改$PATH,并使用不合格的命令名称窃取root访问权限。 - bgvaughan

现在给出简单的答案!没有任何可能搞砸或弄乱你的安装。
只需输入密码几次,然后就再也不用输入了!这将允许您向“root”组添加一个本地管理员帐户,然后从模板中取消注释,从而使整个“root”组拥有超级用户权限。您可以在本文的后面部分阅读我对此过程的安全问题/解决方案。
%username%是您的用户名的全局变量(将其替换为所需的用户名)。
步骤1:打开终端窗口,然后键入“sudo usermod -a -G root %username%”。
步骤2:然后复制/粘贴以下内容...
sudo sed -i 's/# auth       sufficient pam_wheel.so trust/auth       sufficient pam_wheel.so trust/g' /etc/pam.d/su`

第二步 或者输入
sudo nano /etc/pam.d/su`

转到第19行,删除# auth sufficient pam_wheel.so trust前面的"#"(对于某些人来说可能是不同的行号)
*第一个命令将您的%username%添加到组"root"中
第二/第三个命令允许组"root"的所有成员成为超级用户,无需密码,而不仅仅允许用户"root"具有身份验证的su特权。

注意:

不要搞乱 /etc/sudoers... su 认证必须通过很多检查/平衡。超级用户认证使用与所有其他登录认证相同的 pam.d 过程。"/etc/security/access.conf" 通过 tcp/ip(192.168.0.1) 通信和 telnet 服务(tty1&tty2&tty3...等等)提供访问控制的布局。这样可以通过传输协议对每个应用程序进行更精确的过滤。如果安全是您的关注点,那么您应该关注远程/代码威胁而不是有人真的在您离开房间时触碰您的计算机!

偏执狂的食物(不要输入这个,只是查看):

sudo sed -i 's/#-:ALL EXCEPT (wheel) shutdown sync:LOCAL/-:ALL EXCEPT (wheel) shutdown sync:LOCAL/g' /etc/security/access.conf

^ 这将阻止非系统或根用户访问控制台。有时候程序会安装被利用的用户名/组!


2虽然我不是安全专家,但这听起来有点违反直觉。你要禁用整个组的密码,只为了让一个用户在不需要密码的情况下运行特定应用程序,以避免为特定应用程序调整sudo的“复杂性”,对吗?而且这还是在公共服务器上进行的?难道这个脚本让你失去了基本的生存本能吗?安全是有意设计成复杂的。记住,它就像一个洋葱,有很多层,会让你哭泣...在受到攻击的服务器上发生数据丢失只是问题的一部分。黑客从你的系统中发起攻击同样严重,但往往被忽视。 - hmayag
3这是违反直觉和常识的做法:为了只需要一个饼干的用户而打开整个饼干罐是相当不负责任的。你应该将用户添加到sudoers列表中,并消除输入密码的需求,而不是编辑sudoers文件/文件。“如果手枪对儿童来说是不安全的,就不要给他们加农炮。” -我 - John