如何在Linux中模拟身份

1 投票
1 回答
2970 浏览
提问于 2025-04-18 02:47

我开发了一个可以在多个平台上运行的桌面应用程序,使用的是Python和PyQt。在这个应用中,我想实现一个“模拟用户”的功能。具体来说,用户选择一个文件后,应用会检查这个文件的命名规则和其他相关信息。如果一切正常,应用就会把这个文件复制到一个服务器上,只有模拟的用户,比如说(user123),对这个文件有完全的权限,而其他用户只能读取这个文件。

在Windows系统上,我通过使用win32securitywin32con成功实现了这个功能。

模拟登录的代码

Self.handel=win32security.LogonUser(self.loginID,self.domain,self.password,win32con.LOGON32_LOGON_INTERACTIVE,win32con.LOGON32_PROVIDER_DEFAULT)
win32security.ImpersonateLoggedOnUser(self.handel)

恢复到原用户的代码

win32security.RevertToSelf()

有没有人能给我一些在Linux(RHEL 6)上实现这个功能的建议呢?

1 个回答

1

首先,想想你的任务是否真的需要操作系统级别的身份模拟。

  • 比如,如果你使用 PySmbClient 来访问 Windows 文件共享,那么你可以自己管理所有的连接,只需给 smbclient 提供不同的账号信息就可以了。

  • 如果你使用 PyKDE4.kio,情况也是差不多的(KIO 是用 smbclient 的)。

  • 如果你通过已经存在的系统级挂载来访问文件服务器,那么实际上并没有像 Windows 那样的“身份模拟”;这只是通过改变进程的 “有效用户ID” 来实现的,通常只有当程序拥有 root 权限时才能做到(或者在 Linux 上拥有相当于 root 的 CAP_SETUID 权限)。

    uid = pw.getpwnam(username).pw_uid
    
    os.seteuid(uid)
    ...
    os.seteuid(0)
    

    (不过,这并不保证在存储凭证的内核密钥环中能正常工作……对此我还没有答案。)

  • 然而,大多数桌面程序并没有 root 权限(而且不应该拥有)。在这种情况下,seteuid() 是不可用的,特权操作通常是由一个特权守护进程来完成,桌面应用通过某种形式的进程间通信(通常是 D-Bus)与其联系。

撰写回答