2010-01-27 5 views
1

Мне нужно, чтобы скрипт CGI Python выполнял некоторые вещи (немного проверки безопасности), а затем в конечном итоге вызывая скрипт CGI Perl, передавая все, что он получил (например, POST info), на Perl-скрипт.Имейте Python CGI вызывать Perl CGI, передавая исходную информацию (чтобы ограничить поиск личных архивов Mailman для зарегистрированных пользователей)

На мой взгляд, причина в том, что я пытаюсь интегрировать Swish-поиск в архивы списков Mailman.

Swish поиска использует swish.cgi, сценарий Perl, а потому, что это список частных архивов я просто не могу позволить людям позвонить swish.cgi непосредственно в соответствии с рекомендациями на этой странице: http://wpkg.org/Integrating_Mailman_with_a_Swish-e_search_engine#Mailman_configuration

Я считаю, что я нужно сделать, чтобы «приватный» файл cgi-bin Mailman (написанный на Python) выполнял обычную проверку безопасности (которая вызывает несколько модулей Mailman/python), а THEN вызывает swish.cgi для выполнения поиска (после проверки того, что пользователь находится в списке рассылки).

По сути, я считаю, что самым простым решением было бы только защитить доступ к скрипту swish.cgi Perl с вариантом стандартного скрипта cgi-bin/private Python mailmanman.

(Я думал, что люди могут искать с незащищенным swish.cgi, и люди не смогут просмотреть полные результаты, потому что эти сообщения уже защищены паролем по умолчанию Mailman setup ... но проблема заключается в том, что даже показ отрывков из Swish в результатах поиска может привести к конфиденциальной информации, поэтому я должен ограничить доступ даже к самому поисковому запросу только подписчикам.)

Если у кого-то есть лучшее представление о том, как решить общую проблему проблема без выполнения Python-CGI-вызовов-Perl-CGI. Я с удовольствием рассмотрю этот «ответ».

Просто знайте, что моя цель - сделать небольшое (в идеале нет) изменение стандартной установки Mailman. Копирование «частного» скрипта cgi-bin (источник которого - mailman-2.1.12/Mailman/Cgi/private.py) и внесение изменений в вызов swish.cgi классно, но изменение существующего частного скрипта cgi-bin не будет действительно быть круто.


Вот что я сделал, чтобы проверить ответ (используя os.execv заменить сценарий питона с помощью сценария Perl, так что сценарий Perl наследует среду Питон сценария):

Я создал 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 ребенка успешно унаследовал все переменные среды.

+1

Почему бы не просто использовать интерфейс Python для Swish? http://pypi.python.org/pypi/Swish-E/0.5 – friedo

+0

Это отличный второй вариант. Попытайтесь сначала просто вызвать swish.cgi, хотя для этого требуется меньше настраиваемого кодирования. swish.cgi поставляется с Swish и генерирует интерфейс поиска (поле запроса и параметры). Если бы я использовал интерфейс Python для Swish, я считаю, что мне придется все это повторить. Плюс, если мы обновим Swish в будущем, мы получим любые улучшения для swish.cgi автоматически. Но спасибо - если это (Python CGI вызывает swish.cgi Perl CGI) не работает, это отличный план резервного копирования! – Chirael

ответ

1

Я просто заявляю здесь очевидное, потому что у меня нет подробных сведений о вашей конкретной среде.

Если ваш скрипт python является подлинным CGI, а не скриптом mod_python или подобным, это просто обычный процесс, созданный для обработки одного запроса. Вы можете использовать os.execv, чтобы заменить его другим процессом (например,perl CGI), и новый процесс наследует текущую среду процесса, stdin, stdout и stderr. Это предполагает, что вам не нужно читать stdin для проверок безопасности. Это также зависит от того, работает ли ваш CGI в ограниченной среде. execv потенциально опасен и может быть заблокирован в такой среде.

Если вы работаете в среде mod_python или вам нужно заглянуть в опубликованные данные (то есть stdin), то метод execv недоступен для вас. У вас есть две основные альтернативы.

Вы можете запустить perl CGI напрямую (например, посмотреть модуль subprocess), передав ему правильную среду и подав правильные данные в ее stdin. Вы можете вернуть данные из своего stdout необработанного (или, если нужно, файла), обратно обратно на веб-сервер.

В противном случае вы можете сделать локальный веб-запрос для запуска CGI. Вероятно, это потребует немного меньше знаний о настройке сервера, но немного больше работы в CGI python для создания и обработки HTTP-запроса.

+0

Нет, я считаю, что проверки безопасности используют данные cookie, которые отображаются в среде как HTTP_COOKIE и, таким образом, передаются, поэтому stdin не является проблемой. Ваше решение кажется сработавшим - я собираюсь опубликовать последующее сообщение, чтобы предоставить дополнительную информацию, если у кого-то еще будет подобный вопрос в будущем, тогда я приму ваш ответ. Благодаря! :) – Chirael