python 脚本上的 Setuid 位:Linux 与 Solaris

发布于 2024-12-18 14:52:26 字数 547 浏览 0 评论 0原文

我在 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 上,有效的 uid 是由于 setuid 位而设置:

uid,euid = 10002 0

但不是在 Linux 上:

uid,euid = 10002 10002

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

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

I am running this small python script on both linux and Solaris as a not privileged user :

#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()

Before running, the setuid bit is set on the script (not on python interpreter) :

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

On Solaris, the effective uid is set because of the setuid bit :

uid,euid = 10002 0

But not on Linux :

uid,euid = 10002 10002

Note the python version is 2.6 for both Solaris and Linux

Is it possibe to have Python Linux working as Python Solaris ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

秉烛思 2024-12-25 14:52:26

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

请参阅此常见问题解答条目,了解有关该机制为何如此危险的更多背景信息:如何让 setuid shell 脚本工作?

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

相关部分:

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

   return 0;
}

Most Unix distributions normally don't allow you to use setuid on a file that uses a #! interpreter. Solaris happens to be one that allows it due to its use of a more secure implementation than most other distributions.

See this FAQ entry for more background about why the mechanism is so dangerous: How can I get setuid shell scripts to work?

See this link for more discussion and how to compile a setuid executable that will run your script: setuid on shell scripts

The pertinent part:

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

   return 0;
}
淡写薰衣草的香 2024-12-25 14:52:26

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

按照上面链接中的示例操作,您将从 Python 中获得二进制可执行文件,您可以对其进行 chownchmod u+s,从而无需包装程序。

当然,请注意风险(此操作或任何其他 setuid 使用)——脚本中的错误可能会导致系统权限提升。

I just put two and two together today and came up with an alternative solution: cython --embed.

Follow the examples at the link above and you'll get binary executables from your Python that you'll be able to chown and chmod u+s, completing the circle without a wrapper program.

Of course, beware the risks (of this or any other setuid use)—bugs in your script can result in elevated privileges on the system.

じее 2024-12-25 14:52:26

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

#include <unistd.h>

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

    return 0;
}

Based on David K. Hess answer, but with arguments:

#include <unistd.h>

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

    return 0;
}
ぽ尐不点ル 2024-12-25 14:52:26

您可以使用 sudo 来实现您想要的。它以不同的用户身份运行内容:

 sudo -u otheruser command

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

You could potentially use sudo to achieve what you want. It runs stuff as different users:

 sudo -u otheruser command

Permissions are set by root using visudo. The setuid/setguid stuff doesn't appear to apply to scripts or the shell in linux, only compiled code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文