防止 networksetup 要求密码

25

我有一个小应用程序,用于在我的Mac上更改代理设置。它使用networksetup命令来设置代理设置,在Lion系统中运行良好。但是在Mountain Lion系统中,每次更改代理设置时都会要求管理员密码。

networksetup试图修改系统网络配置。输入您的密码以允许此操作。

有没有什么方法可以防止这种情况发生?或者在Cocoa中有更好的更改代理设置的方式吗?在Lion系统中,当我输入密码后,系统记住了它,因此只需要在重新启动后进行身份验证。

我还注意到,在Chrome浏览器中,Proxy Switchy插件也遇到了同样的问题。它显示:

scutil试图修改系统网络配置。输入您的密码以允许此操作。

3个回答

13

使用sudo命令完成此操作,通过为您希望能够执行此命令的用户添加无需密码的规则来实现。

  • 运行visudo以启动编辑器修改/etc/sudoers文件

visudo -f /etc/sudoers
在文件末尾添加一行:
$USERNAME ALL=(root) NOPASSWD: /usr/sbin/networksetup

在 $用户名 处,替换为你要提供无密码访问 networksetup 命令的实际用户名。

  • 保存文件
  • 以您的用户身份运行以下命令进行测试:

/usr/bin/sudo /usr/sbin/networksetup -version

如果设置正确,它将回显版本信息;如果出现错误,它将提示输入密码。

这是一种更安全的方式,因为它限制了哪些用户可以以root权限运行命令,将networksetup二进制文件本身设置为suid root意味着任何登录到系统的人都可以修改你的网络配置。OSX是一个多用户操作系统,应该按照此方式处理。

如果您特别担心安全问题,请确保在调用/usr/bin/sudo时使用完整路径。


请提供更多信息。我尝试了上述方法(假设我的管理员用户名为“fred”),添加了以下内容:{fred ALL=(root) NOPASSWD: /usr/sbin/networksetup}但是在测试时出现了一系列错误(注意是sbin而不是bin)。请问该如何格式化命令? - dcnicholls
我已经编辑了答案以修复路径并使测试更清晰。如果您调用networksetup而没有任何参数,则会获得一长串的使用提示。但这确实证明了它可以在没有密码的情况下工作。 - nanoamp
这些指令现在会产生这个错误:"sudo:在第48行附近的/etc/sudoers中解析错误 sudo:未找到有效的sudoers来源,退出"。我们现在该如何编辑文件? - thefonso
使用visudo编辑文件。这将确保文件没有任何错误。 - stevendaniels
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tdc
这似乎不再起作用了。我猜是因为 SIP 的缘故。 - I0_ol

7

您可以将/usr/sbin/networksetup的权限设置为suid,然后networksetup将以root权限运行,因此您不需要再输入密码。

sudo chmod u+s /usr/sbin/networksetup

关于suid:http://www.linuxnix.com/2011/12/suid-set-suid-linuxunix.html

suid是指可执行文件的权限位之一,当一个普通用户执行一个拥有suid权限的可执行文件时,该文件将以所有者的身份而非执行者的身份运行。这样做可以让其他用户执行需要更高权限的任务,同时保证系统的安全性。

1
这似乎在OS X 10.8上运行良好,但我担心如果我使用Disk Util修复权限,这个修复将会消失。 - sorin
这给了我错误信息:“cp:/Library/Preferences/SystemConfiguration/preferences.plist.old:权限被拒绝”。 - Sean
1
不要设置二进制文件的suid权限 - 这是一种不好的做法,也是sudo首次出现的原因。我已经添加了一个基于sudo的答案来展示这个问题的更安全的解决方案。 - synthesizerpatel
sudo并不能解决这个错误 - 但是10.10和10.11中的新UAC模式可以消除它。 - Jeef
链接已损坏,请修复。 - JBis

0

我也一直在尝试弄清楚这个问题。我注意到手册中提到了以下内容:

任何需要密码的标志都可以接受“-”代替密码,以指示它应该从stdin读取密码。

不太确定如何使用它,但似乎是可能的...


1
你误解了问题,你所说的是给需要密码的命令提供networksetup密码的事情。原帖的问题是networksetup需要由具有管理员权限的用户运行。这里甚至不是networksetup要求输入密码,而是认证管理器。 - SirDarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接