我正在用 Python 为一些不太熟悉 CLI 的用户创建一个小型路由器程序(GTK 前端)。我已经开发了 glade 前端,能够连接各种信号。现在,我只面临一个问题,即创建“sudo”接口。
由于某些原因,我们不希望用户使用 gksu 启动程序,而是向他提供一个密码对话框,该对话框稍后会存储在程序中(类似于 synaptic 包管理器发生的情况)。
问题是,当我在开发该脚本的 GNOME 3 桌面上测试时,该脚本运行正常,但在 ubuntu 上,gksu 命令不会将任何内容保存到密钥环。相反,它会要求输入每个命令的密码!以下是程序中调用 gksu 的函数:
def execute(command,errorstring='', wait = True, shellexec = True):
try:
print 'command=' + command
p=subprocess.Popen("gksu '" + command + "'", shell=shellexec,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
if wait:
p.wait()
result=get_stdout(p)
return result
else:
print 'not waiting'
return p
except subprocess.CalledProcessError as e:
print 'error occured:' + errorstring
return errorstring
下面是我在程序的某些部分调用执行函数的示例:
#stop hostapd if already running.
if is_process_running('hostapd')>0:
writelog('stopping hostapd')
**execute('killall hostapd')**
#enable forwarding in sysctl.
writelog('enabling forward in sysctl.')
set_sysctl('net.ipv4.ip_forward','1')
我该如何做才能让 gksu 调用将密码存储在密钥环或类似的东西中,并且不会每次都打扰用户?
答案1
不确定,但你可能需要禁用 中的选项“tty_tickets” /etc/sudoers
。通常,不再要求输入密码的“宽限期”sudo
与 tty 绑定,请参阅手动的。
警告---这可能是一个安全威胁。
基本上你应该添加到选项
Defaults !tty_tickets
在你的/etc/sudoers
文件中(你知道怎么做,否则最好不要做)。很多信息可以在Arch Linux 维基。请注意,此后,在宽限期内,所有用户应用程序均可获得特权,而无需输入密码......
另一种策略是要求整个脚本在 下运行sudo
。如果您担心始终以 root 权限运行,则可以删除它们,并仅在需要时使用os.seteuid()
。
另一个策略是让程序成为 setuid(你必须使用有一些技巧,请参阅答案中的链接---它适用于 bash,同样适用于 python),然后使用例如组来限制用户的访问(或者删除权限然后在要求输入密码后重新启用它)。