Python脚本的Setuid位:Linux与Solaris之比较
我在Linux和Solaris上运行一个小的Python脚本,作为一个没有特权的用户:
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
在运行之前,这个脚本上设置了setuid位(不是在Python解释器上):
chown root:myusergrp getuid.py
chmod 4750 getuid.py
在Solaris上,由于设置了setuid位,有效的用户ID被设置了:
uid,euid = 10002 0
但在Linux上却没有:
uid,euid = 10002 10002
注意,Solaris和Linux上使用的Python版本都是2.6
有没有可能让Linux上的Python像Solaris上的Python那样工作?
4 个回答
2
根据David K. Hess的回答,下面是带有参数的内容:
#include <unistd.h>
int main(int argc, char **argv)
{
setuid(0);
execv("/path/to/script.sh", argv);
return 0;
}
2
今天我突然想到一个替代方案,就是使用 cython --embed
。
按照上面链接里的例子操作,你可以从你的Python代码生成二进制可执行文件,这样你就可以用 chown
和 chmod u+s
来设置权限,完成整个过程,而不需要额外的包装程序。
当然,要注意风险(无论是这个方法还是其他 setuid
的用法)——如果你的脚本有bug,可能会导致系统权限被提升。
29
大多数Unix系统通常不允许你在使用#!解释器的文件上设置setuid权限。Solaris系统恰好是一个例外,因为它采用了比其他大多数系统更安全的实现方式。
想了解为什么这个机制这么危险,可以看看这个常见问题解答:如何让setuid脚本工作?
如果想要更深入的讨论以及如何编译一个可以运行你脚本的setuid可执行文件,可以参考这个链接:setuid在脚本中的应用
相关部分:
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}