python脚本的Setuid位:Linux vs Solaris



我以非特权用户:

在linux和Solaris上运行这个小python脚本
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()

在运行之前,在脚本(而不是python解释器)上设置setuid位:

chown root:myusergrp getuid.py
chmod 4750 getuid.py

在Solaris上,有效uid是由setuid位设置的:

uid,euid = 10002 0

uid,euid = 10002 10002

注意Solaris和Linux的python版本都是2.6

是否有可能让Python Linux像Python Solaris一样工作?

大多数Unix发行版通常不允许在使用#!翻译。由于Solaris使用了比大多数其他发行版更安全的实现,因此它恰好是一个允许这样做的发行版。

请参阅FAQ条目,了解有关该机制如此危险的更多背景信息:如何使setuid shell脚本工作?

请参阅此链接了解更多讨论以及如何编译一个setuid可执行文件以运行您的脚本:

相关部分:

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );
   return 0;
}

我今天把两件事结合起来,想出了另一个解决方案:cython --embed

按照上面链接的示例,您将从Python中获得二进制可执行文件,您将能够chownchmod u+s,完成没有包装程序的循环。

当然,要注意风险(这个或任何其他使用setuid的风险)—脚本中的错误可能导致系统上的特权升高。

基于David K. Hess的回答,但有参数:

#include <unistd.h>
int main(int argc, char **argv)
{
    setuid(0);
    execv("/path/to/script.sh", argv);
    return 0;
}

您可以使用sudo来实现您想要的功能。它以不同的用户运行东西:

 sudo -u otheruser command

权限由root使用visudo设置。setuid/setguid之类的东西似乎不适用于linux中的脚本或shell,只适用于编译后的代码。

最新更新