让Python CGI调用Perl CGI,传递原始信息(限制对登录用户搜索私人邮件存档)

让Python CGI调用Perl CGI,传递原始信息(限制对登录用户搜索私人邮件存档),python,cgi,mailman,Python,Cgi,Mailman,我需要让一个Python CGI脚本做一些事情(进行一点安全检查),然后最终调用一个Perl CGI脚本,将它接收到的任何内容(例如POST信息)传递到Perl脚本上 作为背景,我这样做的原因是我试图将Swish搜索与邮件列表存档集成在一起 Swish Search使用Swish.cgi,这是一个Perl脚本,但由于这些是私有列表存档,我不能只允许人们按照本页的建议直接调用Swish.cgi: 我认为我需要做的是让Mailman“private”cgi-bin文件(用Python编写)进行定期安

我需要让一个Python CGI脚本做一些事情(进行一点安全检查),然后最终调用一个Perl CGI脚本,将它接收到的任何内容(例如POST信息)传递到Perl脚本上

作为背景,我这样做的原因是我试图将Swish搜索与邮件列表存档集成在一起

Swish Search使用Swish.cgi,这是一个Perl脚本,但由于这些是私有列表存档,我不能只允许人们按照本页的建议直接调用Swish.cgi:

我认为我需要做的是让Mailman“private”cgi-bin文件(用Python编写)进行定期安全检查(调用一些Mailman/Python模块),然后调用swish.cgi进行搜索(在验证用户是否在邮件列表中之后)

本质上,我认为最简单的解决方案就是使用标准mailman cgi bin/private Python脚本的变体来保护对swish.cgi Perl脚本的访问

(我考虑过人们可以使用不受保护的swish.cgi进行搜索,人们将无法查看完整结果,因为默认的邮递员设置已经对这些帖子进行了密码保护……但问题是,即使在搜索结果中显示swish post摘录,也可能会暴露机密信息,因此我必须重新设置ict访问,甚至搜索本身也仅限于订阅者。)

如果有人在不做Python CGI调用Perl CGI的情况下更好地解决整个问题,我会很高兴地考虑“答案”。 要知道,我的目标是对标准的Mailman安装进行少量(理想情况下不做)更改。复制“私有”cgi-bin脚本(其源代码为Mailman-2.1.12/Mailman/cgi/private.py)并更改调用swish.cgi很酷,但修改现有的私有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)
print "Content-type: text/html\n\n";
while (($key,$value) = each %ENV) {
  print "<p>$key=$value</p>\n";
}
然后是一个带有以下内容的perltest脚本:

import os
os.environ['FOO'] = 'BAR'
mydir = os.path.dirname(os.environ.get('SCRIPT_FILENAME'))
childprog = mydir + '/perltest'
childargs = []
os.execv(childprog, childargs)
print "Content-type: text/html\n\n";
while (($key,$value) = each %ENV) {
  print "<p>$key=$value</p>\n";
}
print“内容类型:text/html\n\n”;
而(($key,$value)=每个%ENV){
打印“$key=$value

\n”; }

然后我打电话看到环境打印输出中包含了自定义的FOO变量,因此child perltest进程成功地继承了所有的环境变量。

我只想在这里说明显而易见的情况,因为我对您的特定环境没有任何详细的了解

如果您的python脚本是真正的CGI,而不是mod_python脚本或类似脚本,那么它只是处理一个请求的常规进程。您可以使用
os.execv
将其替换为另一个进程(例如perl CGI)新进程将继承当前进程的环境,
stdin
stdout
stderr
。这假设您不需要读取
stdin
进行安全检查。这还可能取决于您的CGI是否在受限环境中运行。
execv
具有潜在危险性和安全性在这样的环境中,ht可能会被阻塞

如果您在mod_python环境中运行,或者需要查看发布的数据(例如,
stdin
),那么execv方法对您不可用。您有两个主要选择

您可以直接运行perl CGI(例如,查看
子流程
模块),为其提供正确的环境,并将正确的数据提供给其
stdin
。您可以将
stdout
原始(或烹调,如果需要)返回的数据直接假脱机回web服务器


否则,您可以发出一个本地web请求来运行CGI。这可能需要较少的关于服务器设置的知识,但在python CGI中需要更多的工作来发出和处理HTTP请求。

我将在这里陈述显而易见的一点,因为我对您的特定环境没有任何详细的了解

如果您的python脚本是真正的CGI,而不是mod_python脚本或类似脚本,那么它只是处理一个请求的常规进程。您可以使用
os.execv
将其替换为另一个进程(例如perl CGI)新进程将继承当前进程的环境,
stdin
stdout
stderr
。这假设您不需要读取
stdin
进行安全检查。这还可能取决于您的CGI是否在受限环境中运行。
execv
具有潜在危险性和安全性在这样的环境中,ht可能会被阻塞

如果您在mod_python环境中运行,或者需要查看发布的数据(例如,
stdin
),那么execv方法对您不可用。您有两个主要选择

您可以直接运行perl CGI(例如,查看
子流程
模块),为其提供正确的环境,并将正确的数据提供给其
stdin
。您可以将
stdout
原始(或烹调,如果需要)返回的数据直接假脱机回web服务器


否则,您可以发出一个本地web请求来运行CGI。这可能需要较少的关于服务器设置的知识,但是python CGI中需要更多的工作来发出和处理HTTP请求。

为什么不使用python接口来Swish?这是一个很好的第二个选项。首先尝试调用Swish.CGI,尽管是because它需要更少的自定义编码。swish.cgi随swish提供并生成搜索界面(查询框和选项)。如果我使用Python界面swish,我相信我必须重新实现所有这些。此外,如果我们将来升级swish,我们将自动对swish.cgi进行任何改进。但是