Python CGI script IOError Broken Pipe

hlasů
2

Mám starý Python založený webový formulář, že jsem se aktualizuje použití GPG pro encyption místo již není podporován python balíček. Při volání skriptu pomocí příkazového řádku funguje to v pohodě, ale přes internetovému prohlížeči a CGI dojde k chybě: IOError: [32] ERRNO prasknutí potrubí . K této chybě dochází, pokud mohu použít balíček gnupg nebo když se snažím mluvit s gpg přímo prostřednictvím dílčího.

provedení:

Python 2.4.1 
gnupg 0.2.2 (python GPG wrapper)
Apache/2.2.9 
gpg 1.4.9

Zde je zjednodušený scénář:

#!/usr/bin/python 

import sys
# send python tracebacks out to the web browser
sys.stderr = sys.stdout
import gnupg
gpg = gnupg.GPG()
gpgkey = 'np'
message = 'Our secret message!'
print Content-type: text/html\r\n
print '''<html><head><title>Test GPG access via cgi</title>
          </head><body><pre>'''
print 'message in the clear:'
print message
encrypted = str(gpg.encrypt(message, 'np'))
print 'message encrypted:' 
print encrypted
print '''</pre></body></html>'''sf

Je-li výše uvedený skript volal přes příkazový řádek, to běží v pohodě, ale když zavolal přes CGI generuje následující chyby:

message in the clear:
Our secret message!
Traceback (most recent call last):
  File /home/dkmaster/www/nickads/secure-cgi/gpgtest.py, line 23, in 
    encrypted = str(gpg.encrypt(message, 'np'))
  File /home/dkmaster/www/nickads/secure-cgi/gnupg.py, line 517, in encrypt
    return self.encrypt_file(StringIO(data), recipients, **kwargs)
  File /home/dkmaster/www/nickads/secure-cgi/gnupg.py, line 467, in encrypt_file
    self._handle_io(args, file, result, passphrase=passphrase)
  File /home/dkmaster/www/nickads/secure-cgi/gnupg.py, line 201, in _handle_io
    _copy_data(file, stdin)
  File /home/dkmaster/www/nickads/secure-cgi/gnupg.py, line 75, in _copy_data
    outstream.write(data)
IOError: [Errno 32] Broken pipe

Také jsem se snažil mluvit s gpg přímo prostřednictvím dílčího a ne na GnuPG modul.

#!/usr/bin/python

import sys
import subprocess
sys.stderr = sys.stdout
print Content-type: text/html\r\n
print '''<html><head><title>Test subprocess via cgi</title>
           </head><body><pre>'''

plain_text = 'the quick fox ' * 10
print plain_text
gpgCommand = /usr/bin/gpg --quiet -a -e -r 'np' 
gpgProcess = subprocess.Popen(
                      gpgCommand,
                      stdin=subprocess.PIPE, 
                      stdout=subprocess.PIPE, 
                      stderr=subprocess.PIPE, 
                      shell=True
                      )
encrypted_text = gpgProcess.communicate(plain_text)[0]
print encrypted_text

Opět funguje spolehlivě z příkazového řádku, ale ne přes CGI, který vytváří podobnou chybu:

Traceback (most recent call last):
  File /home/dkmaster/www/nickads/secure-cgi/subprocesstest.py, line 20, in 
    encrypted_text = gpgProcess.communicate(plain_text)[0]
  File /usr/lib/python2.5/subprocess.py, line 670, in communicate
    return self._communicate(input)
  File /usr/lib/python2.5/subprocess.py, line 1220, in _communicate
    bytes_written = self._write_no_intr(self.stdin.fileno(), buffer(input, input_offset, 512))
  File /usr/lib/python2.5/subprocess.py, line 999, in _write_no_intr
    return os.write(fd, s)
OSError: [Errno 32] Broken pipe

Tak jak mohu opravit potrubí v CGI?

Položena 25/11/2009 v 17:51
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Vím, že moje odpověď může přijít příliš pozdě, ale v poslední době jsem měl stejný problém a myslím, že bych mohl vyřešit.

GPG Zdá se, že výstup nějaké věci ( „Musíte si přístupové heslo“ blabla) ke konektoru bez ohledu na standardní výstup přesměrování - neptejte se mě, jak :)

Nicméně se zdá, že Broken Pipe nastat, protože gpg nelze výstup tyto zprávy v prostředí CGI (stane pro mě uwsgi). Dokonce se vytiskne je, zda --quietbyl podán. To jen se zdá být opravdu tichý, pokud si projít --batchdodatečně.

Odpovězeno 12/01/2010 v 23:38
zdroj uživatelem

hlasů
0

Dobrá otázka - nejsem si jistý, že je to buď python-gnupgzáležitost nebo dokonce gpgzáležitost. Mohlo by to být problém s subprocessnebo cginebo nějaká interakce mezi těmito dvěma. Co se stane, když se pokusíte to s velmi minimální skript, který čte ze standardního vstupu a zapisuje výstup do souboru? Funguje to?

Je také třeba umožnit přihlášení vidět, co to hází, pokud vůbec něco. Podívejte se na test_gnupg.pyskript jako příklad o tom, jak to udělat.

Odpovězeno 25/11/2009 v 20:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more