我需要一个 Python CGI 脚本做一些事情(一点点安全检查),然后最终调用一个 Perl CGI 脚本,将它收到的任何内容(例如,POST 信息)传递到 Perl 脚本上。
作为背景,我这样做的原因是我正在尝试将 Swish 搜索与 Mailman 列表文件集成。
Swish 搜索使用 swish.cgi(一个 Perl 脚本),但因为这些是私有(private)列表文件,所以我不能只允许人们按照此页面上的建议直接调用 swish.cgi:http://wpkg.org/Integrating_Mailman_with_a_Swish-e_search_engine#Mailman_configuration
我相信我需要做的是让 Mailman“私有(private)”cgi-bin 文件(用 Python 编写)进行常规安全检查(调用一些 Mailman/python 模块),然后调用 swish.cgi 来执行搜索(在验证用户位于邮件列表中之后)。
本质上,我认为最简单的解决方案就是使用标准 mailman cgi-bin/private Python 脚本的变体来保护对 swish.cgi Perl 脚本的访问。
(我考虑过人们可以使用不 protected swish.cgi 进行搜索,并且人们无法查看完整的结果,因为这些帖子在默认的 Mailman 设置中已经受到密码保护......但是问题是,即使在搜索结果中显示 Swish 帖子摘录也可能会泄露 secret 信息,因此我必须将搜索本身的访问权限限制为仅限订阅者。)
如果有人更好地了解如何在不执行 Python-CGI-calls-Perl-CGI 的情况下解决整个问题,我会很乐意将其视为“答案”。
只要知道我的目标是对标准 Mailman 安装进行少量(最好是没有)更改即可。复制“私有(private)”cgi-bin 脚本(其来源为 mailman-2.1.12/Mailman/Cgi/private.py)并进行更改以调用 swish.cgi 很酷,但修改现有的私有(private) cgi-bin 脚本则不行真的很酷。
<小时/>这是我测试答案的方法(使用os.execv
将python脚本替换为perl脚本,以便perl脚本将继承python脚本的环境):
我创建了一个pythontest脚本:
import os
os.environ['FOO'] = 'BAR'
mydir = os.path.dirname(os.environ.get('SCRIPT_FILENAME'))
childprog = mydir + '/perltest'
childargs = []
os.execv(childprog, childargs)
然后是一个 perltest 脚本:
print "Content-type: text/html\n\n";
while (($key,$value) = each %ENV) {
print "<p>$key=$value</p>\n";
}
然后我打了http://myserver.com/cgi-bin/pythontest并看到环境打印输出包含自定义 FOO 变量,因此子 perltest 进程已成功继承了所有环境变量。
最佳答案
我只是想在这里陈述显而易见的事情,因为我对您的具体环境没有任何详细的了解。
如果您的 python 脚本是真正的 CGI 而不是 mod_python 脚本或类似脚本,那么它只是为处理一个请求而生成的常规进程。您可以使用os.execv
将其替换为另一个进程(例如 perl CGI),新进程将继承当前进程的环境,stdin
, stdout
和stderr
。这假设您不需要阅读 stdin
以便您进行安全检查。它还可能取决于您的 CGI 是否在受限环境中运行。 execv
存在潜在危险,在这种环境下可能会被阻止。
如果您在 mod_python 环境中运行,或者需要查看已发布的数据(即 stdin
),则 execv 方法不适合您。您有两个主要选择。
您可以直接运行 perl CGI(例如查看 subprocess
模块),为其提供正确的环境并将正确的数据提供给其 stdin
。您可以从其 stdout
中获取返回的数据。生的(或熟的,如果需要)直接返回到网络服务器。
否则,您可以发出本地 Web 请求来运行 CGI。这可能需要较少的服务器设置知识,但需要在 python CGI 中进行更多的工作来发出和处理 HTTP 请求。
关于python - 让 Python CGI 调用 Perl CGI,传递原始信息(以限制对登录用户搜索私有(private) Mailman 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145097/