登录ubuntu之前如何在python守护进程中使用DBUS

Posted

技术标签:

【中文标题】登录ubuntu之前如何在python守护进程中使用DBUS【英文标题】:How to use DBUS in python daemon before login in ubuntu 【发布时间】:2021-01-21 00:31:56 【问题描述】:

(背景:我最近看到了一个很棒的 android 应用程序,它与 linux 配对,允许用户解锁和锁定锁屏。但是该项目不再工作和维护了。我正在努力让它工作,但有一个DBUS 有问题)

创建了一个守护程序服务,它打开一个套接字并等待传入​​连接。当它接收到一个连接时,它会尝试获取一个 DBUS_ADDRESS 和 UID 并将其设置在环境变量中:

os.environ['DBUS_SESSION_BUS_ADDRESS'] = DBUS_ADDRESS
os.seteuid(UID)

这就是我获取 DBUS 和 UID 地址的方式:

def get_bus_and_uid():
    '''Find the first running process with a DBUS session address run by
    a non-daemon user, and return both the DBUS_SESSION_BUS_ADDRESS and the
    uid.'''

    DBUS_ADDRESS = 'DBUS_SESSION_BUS_ADDRESS'
    UIDS = 'uids'

    # Find all non-daemon users.
    all_users = [i.split(':') for i in open('/etc/shadow').readlines()]
    users = [i[0] for i in all_users if i[1] not in ('!', '*')]

    # Find the first non-daemon user process with a DBUS_SESSION_BUS_ADDRESS
    # in it's environment.
    user_address = 
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid', 'username', UIDS])
        except psutil.NoSuchProcess:
            pass
        user = pinfo['username']

        # Ignore process run by daemons.
        if user not in users:
            continue

        environ = psutil.Process(pid=pinfo['pid']).environ()

        
        if DBUS_ADDRESS in environ:
            # pinfo[uids] returns real, effective and saved uids.
            return environ[DBUS_ADDRESS], pinfo[UIDS][0]
    return None, None

但问题是,如果在至少一个用户登录后调用 get_bus_and_uid(),则此方法有效。如果在首次登录之前建立了任何连接,则会失败。

我尝试了什么: 我尝试通过守护程序使用 $dbus-launch 启动 DBUS 服务,但仍然没有运气。 有没有其他方法可以使用 DBUS 与 org.(gnome|freedesktop).screensaver 进行通信?

(这一切都是为了与 org.(gnome|freedesktop).screensaver 通信)

github中的项目:Remote-linux-unlocker/unlocker-daemon.py

任何帮助表示赞赏,在此先感谢。

编辑:如果没有活动的桌面会话,也没有什么可以解锁的。感谢@tripleee 的澄清

【问题讨论】:

没有用户有什么要锁定的? @tripleee 但我们可以解锁对吧?我是 linux 新手,不确定登录屏幕,锁定/解锁是否仅限于用户? 嗯?不,如果没有活动的桌面会话,也没有什么可以解锁的。 @tripleee 哦,谢谢,我明白了。 【参考方案1】:

如果会话与systemd-logind 集成(GNOME、Cinnamon 和 KDE 都支持),

loginctl unlock-sessions

将解锁所有会话。

【讨论】:

以上是关于登录ubuntu之前如何在python守护进程中使用DBUS的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Linux设置守护进程时出错的解决

Ubuntu守护进程出错怎么办

ubuntu12.04下创建了一个守护进程,生成了一个可执行文件,如何让这个可执行文件开机自动运行?

如何在Python中使类成员进程安全

Python 脚本作为 linux 服务/守护进程

当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何给它更多的堆空间?