我在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一样工作吗?
大多数Unix发行版通常不允许你在使用#!的文件上使用setuid。 翻译。 由于使用比大多数其他发行版更安全的实施方式,Solaris正好是允许的。
关于为什么机制如此危险的更多背景信息,请参阅此FAQ条目: 如何获取setuid shell脚本?
看到这个链接更多的讨论,以及如何编译将运行你的脚本的setuid可执行文件: setuid在shell脚本
相关部分:
int main() { setuid( 0 ); system( "/path/to/script.sh" ); return 0; }
我只是把两个和两个在一起,并提出了一个替代解决方案: cython --embed
。
按照上面链接的例子,你将得到你的Python的二进制可执行文件,你将能够chown
和chmod u+s
,完成没有包装程序的圆。
当然,要注意脚本中的风险(这个或者其他setuid
使用),可能会导致系统的特权提升。
你可以使用sudo来实现你想要的。 它运行不同的用户的东西:
sudo -u otheruser command
权限是由root用visudo设置的。 setuid / setguid的东西似乎不适用于脚本或在Linux中的shell,只有编译的代码。