我有一个在Python脚本中的任务需要root权限,希望从Django(www用户)调用。一开始我认为可以使用Python的os.seteuid()函数并设置脚本的setuid位,但后来意识到这会要求设置Python本身的setuid位,而这可能是不可取的。据我所知,如果使用sudo也将面临相同的问题,而我真的想避免使用sudo。
此时,我考虑编写一个C语言包装器,使用seteuid并以root身份调用我的Python脚本,将必要的参数传递给它。我是否应该这样做,还是应该找其他解决方案?
我有一个在Python脚本中的任务需要root权限,希望从Django(www用户)调用。一开始我认为可以使用Python的os.seteuid()函数并设置脚本的setuid位,但后来意识到这会要求设置Python本身的setuid位,而这可能是不可取的。据我所知,如果使用sudo也将面临相同的问题,而我真的想避免使用sudo。
此时,我考虑编写一个C语言包装器,使用seteuid并以root身份调用我的Python脚本,将必要的参数传递给它。我是否应该这样做,还是应该找其他解决方案?
在Python中,sudo不需要setuid位。你可以仅为一个命令启用sudo,而不需要任何参数:
www ALL=(ALL) NOPASSWD: /root/bin/reload-stuff.py ""
如果你的脚本不带任何参数,不能被www用户覆盖,并且sudo执行“env_reset”(在大多数发行版中是默认设置),那么这将是安全的。
你可以接受参数,但是要非常小心 -- 不要使用输出文件名,确保验证所有输入。在这种情况下,从sudo行末尾删除“”。
sudo
允许您限制传递给程序的参数。来自 man sudoers
:
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
On the ALPHA machines, user john may su to anyone except root but
he is not allowed to specify any options to the su(1) command.
因此请使用sudo。当然,您需要特别小心根访问权限-确保只有root可以修改脚本本身和任何父目录,并且脚本是安全的,只执行必须作为root运行的绝对最低限度的操作。
subprocess
和sudo
将其作为外部进程执行,尽管这一切都让人感到不妙。 - Anders