我以非特权用户:
在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中获得二进制可执行文件,您将能够chown
和chmod 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,只适用于编译后的代码。