如何在linux中模拟
Posted
技术标签:
【中文标题】如何在linux中模拟【英文标题】:how to impersonate in linux 【发布时间】:2014-04-15 09:04:05 【问题描述】:我在 python 和 PyQt 中开发了一个多平台桌面应用程序,我想在其中实现模拟的概念。我有一个要求,用户选择一个文件,应用程序将检查命名约定和其他内容。如果一切正常,那么它将文件复制到服务器中,其中只有模拟用户可以说 (user123) 具有完全权限,而其他用户只有读取权限。
我可以通过使用win32security
和win32con
在Windows 中实现这一点
模拟登录
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】:首先,考虑您的任务是否真的需要操作系统级别的模拟。
如果您使用例如PySmbClient 访问 Windows 文件共享,然后您自己管理所有连接,您可以只为 smbclient 提供不同的凭据。
如果您使用 PyKDE4.kio,据我所知同样适用(KIO 使用 smbclient)。
如果您通过现有的系统级挂载访问文件服务器,则不会像在 Windows 中那样实际“模拟”;它通过简单地更改进程'"effective UID" 来完成,并且通常只有当程序具有 root 权限(或 Linux 上的 root 等效 CAP_SETUID 权限)时才能完成。
uid = pw.getpwnam(username).pw_uid
os.seteuid(uid)
...
os.seteuid(0)
(这不能保证与将凭据存储在内核密钥环中的网络文件系统一起使用......我还没有答案。)
但是,大多数桌面程序没有 root 权限(并且不应该拥有这些权限)。在这种情况下,seteuid() 不可用,特权操作通常由桌面应用程序使用某种形式的 IPC(通常是 D-Bus)联系的特权守护进程完成。
【讨论】:
以上是关于如何在linux中模拟的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Cygwin(Linux 模拟器)中使用 Eclipse(IDE)?
如何在 Linux Mint 中以编程方式发送密钥(模拟密钥输入)?