以其他用户身份运行Python脚本
在一台Linux电脑上,我想以另一个用户的身份运行一个Python脚本。
我已经用C++写了一个包装程序来调用这个脚本,因为我发现运行脚本的权限是由Python解释器的拥有者决定的。然后,我把这个C++程序的用户改成了另一个用户,并运行了这个C++程序。
但是这个设置似乎不太管用。有什么想法吗?
3 个回答
使用命令 sudo
。
为了以某个用户的身份运行程序,系统需要先“验证”这个用户的身份。
显然,root
用户可以以任何用户的身份运行任何程序,而其他用户可以通过输入密码来切换到另一个用户(这叫做 su
)。
程序 sudo
可以被设置成允许一组用户以特定用户的身份运行特定的命令。
举个例子,你可以创建一个叫 scriptUsers
的用户组和一个叫 scriptRun
的用户。然后,配置 sudo
让 scriptUsers
组里的任何用户都可以以 scriptRun
的身份来运行你的脚本。
给那些用户一个权限,让他们可以用 sudo su $dedicated_username
这个命令来切换到一个特定的用户。同时,你需要设置系统的权限,让这个 $dedicated_user
拥有足够的访问权限,但又不要过多。
你可以用 os.setuid() 来设置用户,用 pwd 来获取用户的 uid。具体代码可以这样写:
>>> import pwd, os
>>> uid = pwd.getpwnam('root')[2]
>>> os.setuid(uid)
当然,这个方法只有在用户或可执行文件有权限的情况下才能使用。如果你是超级用户(root),那就没问题。我觉得你可能需要在 Python 可执行文件上设置 setuid 标志,但这样会留下一个巨大的安全漏洞。可能如果你设置的用户是一个专门的受限用户,只能做你需要的事情,那这样做是可以的。
Unix 的安全性,基于用户和 setuid 等机制,并不是很好,也不太实用,容易留下大安全漏洞。一个更安全的选择其实是采用客户端-服务器的方式,这样你可以有一个后台程序(daemon)来处理所有事情,客户端则与它进行沟通。这样后台程序可以以比用户更高的安全级别运行,但用户在运行脚本时需要提供用户名和密码,或者用某种公钥/私钥的方式来验证身份。