python - 让 Python CGI 调用 Perl CGI,传递原始信息(以限制对登录用户搜索私有(private) Mailman 文件)

标签 python cgi mailman

我需要一个 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 , stdoutstderr 。这假设您不需要阅读 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/

相关文章:

perl - CGI 脚本中的处理 URL

json - Perl 的 JSON::XS 未正确编码 UTF8?

ruby-on-rails - 如何使用 mailman 处理电子邮件线程

python - json.loads 允许字典中的重复键,覆盖第一个值

python - pyQt 和 QTextEdit : Why are some unicode characters are shown, 其他不是吗?

tomcat - cgi 和 tomcat

email - Mailman 邮件列表 nntp 支持

Python:分析 CSV 文件 100,000 行 x 40 列

python - Scipy 的 solve_ivp 函数文档中的字母 k 是什么意思?