2009-06-29 7 views
1

Ich möchte PHP verwenden, um eine PGP-Verschlüsselungsbefehl 'exec'. Unabhängig von der Kommandozeile bekomme ich entweder einen Fehler 64 (Parserfehler) oder 162 (Fehler während einer Codierung). So habe ich die Befehlszeile innerhalb des PHP-Programm auf diesem einfachen Fingerabdruck Anzeige reduziert, die Standbilder irrt aus:PHP exec pgp Befehl

exec("/opt/pgp/bin/pgp --fingerprint", $results); 

Wenn ich „/ opt/pgp/bin/pgp --fingerprint“ in einer Befehlszeile Ich laufe bekommen "2 Schlüssel gefunden" und die erwartete Anzeige. Aber die selbe Exec unter PHP gibt mir den Parserfehler 64. Ich habe "\ n" zum Zeichenkettenbefehl versucht und das macht keinen Unterschied. Der Benutzer läuft als 'nobody' im Browser, der eine Ausführungsberechtigung für pgp hat. (Wenn PGP nicht gestartet wurde, würde ich nicht einmal den "Parserfehler" sehen.)

Gibt es etwas Besonderes, was ich tun muss, um PHP unter PHP laufen zu lassen?


Ich habe versucht, zurück gegangen, um tatsächlich eine Datendatei zu verschlüsseln. Hier ist die 'status-file' Ausgabe, die pgp erstellt. Es zeigt eindeutig einen Fehler in der letzten Zeile von 'Berechtigung verweigert' für die Datei, die ich versuche, 'test.txt' zu verschlüsseln. Das ist falsch. Ich habe der ganzen Datei die gesamte R/W zugeteilt und sie greift eindeutig darauf zu, da der Status besagt, dass der Inhalt verschlüsselt wurde. Also, wirklich ist die Frage, was ist die Erlaubnis verweigert?

Einige andere Info: Wenn ich PHP von der Kommandozeile aus gegen dieses PHP-Skript ausführen, das pgp aufruft, funktioniert es gut - die Datei wird verschlüsselt. Auch PERL führt die gleichen Befehle (mit SYSTEM()) beim Aufruf aus dem Browser. ABER, wenn der Browser verwendet wird, um dieses PHP-Skript aufzurufen, schlägt es fehl. Offensichtlich gibt es ein Berechtigungsproblem, das als "Niemand" läuft.

/export/home/pgphome/.pgp/pubring.pkr:open keyrings (1006: Schlüsselbund) /export/home/pgphome/.pgp/secring.skr:open keyrings (1007: privater Schlüsselbund) 0x221DC947: verschlüsseln (1030: Schlüssel zur Empfängerliste hinzugefügt) /export/home/eckankar/dev/www/info/test.txt:encrypt (3048: Daten verschlüsselt mit Chiffre AES-128) /export/home/eckankar/dev/www/info/test.txt: encrypt (3124: permission denied)

Als Hintergrund hier ist das Argument des PHP exec() Befehls: /opt/pgp/bin/pgp --encrypt/export/home/eckankar/dev/inc/test.txt --output /export/home/eckankar/dev/www/info/test.xxx -r mitgliedschaft --überschreiben entfernen --home-d ir /export/home/pgphome/.pgp -v --status-datei /export/home/eckankar/dev/inc/test.txt.err

Alle Ordner/Verzeichnisse in diesem Befehl haben 'rwx' gewährt zur Welt. Hier

ist, was die Statusausgabedatei aussieht, wenn die encrypt gelingt, wie es funktioniert, wenn von einer Befehlszeile (/ opt/CSW/php5/bin/php test.php), anstatt über den Browser:

PGP: Verschlüsseln (3157: aktuelle Ortszeit 2009-06-30T11: 51: 17-05: 00) /export/home/pgphome/.pgp/pubring.pkr:open Schlüsselringe (1006: öffentlicher Schlüsselring) /Export /home/pgphome/.pgp/secring.skr:open keyrings (1007: privater Schlüsselring) 0x221DC947: encrypt (1030: Schlüssel zur Empfängerliste hinzugefügt) /export/home/eckankar/dev/inc/test.txt:encrypt (3048: Daten verschlüsselt mit Chiffre AES-128) /export/home/eckankar/dev/inc/test.txt:encrypt (0: Ausgabedatei/export/home/eckankar/dev/inc/test.txt.pgp)

+0

Haben Sie es versucht Befehlszeile? Funktioniert es wie erwartet? – karim79

Antwort

0

In welchem ​​Ausführungskontext läuft dieses PHP-Skript? Interaktive Befehlszeile, Cron-Job, Webserver (hoffe ich nicht)?

Abhängig von der Antwort kann ich beginnen, Umgebungsvariablen zu betrachten, von denen PGP abhängt, die nicht festgelegt werden, wenn es von diesem Skript ausgeführt wird.

+0

Ja, der eigentliche Befehl zum Verschlüsseln einer Datei wird im Web Server-Kontext ausgeführt, nämlich "nobody", was wie erwartet mit erheblichen Einschränkungen verbunden ist. Der Web-Server verschlüsselt die übermittelten Benutzerinformationen so, dass sie nicht im Klartext liegen. (Der private Schlüssel existiert auf diesem Server nicht). Irgendeine Idee, welche Umgebungsvariablen pgp vielleicht sehen möchten? –

+0

P.S. Ich sehe zwei Umgebungsvariablen: PGP_HOME_DIR, die ich explizit in der Befehlszeile einstelle (obwohl nicht in meinem --fingerprint Beispiel) und die andere ist LD_LIBRARY_PATH, die gleich/opt/pgp/lib ist. Nicht sicher, ob letzteres das Problem ist ... –

+0

und ein weiteres genannt PHOME, das gleich/opt/pgp –

1

Antwort ist: muss ein - temp-dir in der Befehlszeile angeben.

0

Ich weiß, das ist alt, aber ich habe gerade etwas davon bekommen. (pgp 8.5)

Wie Jim Thomas sagte, ist dies ein Verzeichnis Erlaubnis Problem. Aber zumindest erlaubt es 8.5 nicht, tmpdir so einzustellen, wie ich es sehen kann.

Meine Lösung (Pseudo-Code):

save cwd 
chdir(/tmp/) 
system()/exec() pgp command 
chdir(saved_cwd) 

Odd dass pgp den tmp dir zwingt in cwd erstellt werden, aber ich sah keine Fahne Lage zu beeinflussen.