Ubuntu 上 Python 脚本的“sudoing”策略

Ubuntu 上 Python 脚本的“sudoing”策略

我正在用 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),然后使用例如组来限制用户的访问(或者删除权限然后在要求输入密码后重新启用它)。

相关内容