16

作为非特权用户在 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 位设置了有效的 uid:

uid,euid = 10002 0

但不是在 Linux 上:

uid,euid = 10002 10002

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

是否可以让 Python Linux 作为 Python Solaris 工作?

4

4 回答 4

29

大多数 Unix 发行版通常不允许您在使用 #! 的文件上使用 setuid。口译员。Solaris 恰好是允许它使用的,因为它使用了比大多数其他发行版更安全的实现。

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

有关更多讨论以及如何编译将运行您的脚本的 setuid 可执行文件,请参阅此链接:shell 脚本上的 setuid

相关部分:

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

   return 0;
}
于 2011-11-29T17:14:33.137 回答
2

我今天只是把两个和两个放在一起,想出了一个替代解决方案:cython --embed.

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

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

于 2012-07-03T16:17:25.453 回答
2

基于David K. Hess的回答,但有论据:

#include <unistd.h>

int main(int argc, char **argv)
{
    setuid(0);
    execv("/path/to/script.sh", argv);

    return 0;
}
于 2021-04-26T16:31:48.867 回答
-2

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

 sudo -u otheruser command

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

于 2015-05-12T23:42:05.180 回答