Ich habe das Kommandozeilenprogramm „Whitaker’s Words“ heruntergeladen, das sowohl für Linux als auch für Windows etc. verfügbar war.
Es gibt ein Hauptprogramm namens words
. Ich habe versucht, es auf meinem Ubuntu-Rechner (11.10) über die Kommandozeile auszuführen und es hat funktioniert:
./words
Als ich es auf meinem Linux-Webserver (Linux 2.6.37-he-xeon-64gb+1 i686) getestet habe, hat es auch funktioniert.
Dann habe ich beschlossen, einige Änderungen am Quellcode vorzunehmen und ihn neu zu kompilieren. Dazu habe ich die folgenden Befehle verwendet (die letzten vier sind unterstützende Programme):
gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static
Das resultierende Programm funktionierte auf meinem Ubuntu-Rechner wieder ordnungsgemäß, da ich die richtige Ausgabe im Terminal sehen konnte.
shell_exec()
Aber als ich versuchte, es mit PHP oder auf meinem Webserver auszuführen passthru()
, gab es einfach keine Ausgabe! Laut ldd
ist das Programm statically linked
so, dass es eigentlich funktionieren sollte, oder nicht?
Ich habe jetzt wochenlang getestet und Fehler behoben und kann keinen Grund dafür finden. Können Sie mir helfen?
Das Programm gibt es hier:Download-Link bei filedropper.com
(Ich vermute, das ist keine Programmierfrage, da mein Problem lediglich lautet: Wie bekomme ich das Programm auf meinem Webserver zum Laufen?)
System, auf dem ich das Programm kompilieren möchte:
Linux Ubuntu 3.0.0-12-generisch #20-Ubuntu x86 GNU/Linux
Dies ist die neueste Wubi-Version (32-Bit) von Ubuntu.
ldd --version
Ausgängeldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13
System, auf dem ich das kompilierte Programm ausführen möchte (Webserver):
Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
ldd --version
Ausgängeldd (GNU libc) 2.7
Notiz:
Fehler auf der Serverseite können ausgeschlossen werden, da alles problemlos funktioniert, wenn ich einfach mein eigenes Linux-Programm durch das vorkompilierte ersetze.
Update Nr. 1:
Ich habe versucht, das Programm (das unter Ubuntu 11.10 einwandfrei funktioniert) in meiner VirtualBox unter Ubuntu 5.10 auszuführen – und es hat auch nicht funktioniert. Gute Neuigkeiten, es liegt also definitiv nicht am Server. Ubuntu 5.10 hat gerade gesagt: floating point exception
. Hilft das? Warum gibt es eine Ausnahme, aber nicht unter Ubuntu 11.10?
Update Nr. 2:
Jetzt mit Ubuntu 5.1 unter Verwendung von GNAT 3.4 kompiliert. Aber alle Hoffnung ist vergebens – immer noch keine Ausgabe, ldd
sagt statically linked
(da ich es so kompiliert habe) und strace
gibt dieselbe Fehlermeldung aus. Was bedeutet das? Fehlt eine Datei? Ist das der Grund, warum es nicht funktioniert?
execve("./words", ["./words"], [/* 15 vars */]) = 0
brk(0) = 0x811e000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Antwort1
Wenn Sie etwas als Shell-Escape vom Webserver oder einem anderen Programm ausführen, werden die Umgebungseinstellungen höchstwahrscheinlich nicht angewendet. Beispielsweise haben Variablen wie: PATH
, LD_LIBRARY_PATH
, usw. ihre Standardeinstellungen oder überhaupt keine Einstellungen. Wenn Sie also den Shell-Escape ausführen, sollten Sie zumindest Folgendes tun:
- Rufen Sie das Programm über den vollständigen Pfad auf: zB
/usr/local/bin/gnatmake
oder/usr/local/bin/words
- Holen Sie sich die Ausgabe,
/usr/bin/env
um sicherzustellen, dass die Einstellungen im Shell-Escape korrekt sind. Überprüfen Sie die gleichen Einstellungen in Ihrer Terminal-Shell. - Wenn Sie die Kontrolle über den Webserver haben, versuchen Sie, ihn als Ihre UID auszuführen, um Berechtigungsprobleme zu vermeiden.
- Überprüfen Sie, welche Bibliotheken für das Programm erforderlich sind, falls vorhanden
ldd /usr/local/bin/words
ZUSÄTZLICHE MÖGLICHKEIT
Anstatt das Programm direkt auszuführen, verwenden Sie das folgende Skript:
#!/bin/sh
. /etc/profile
/usr/bin/env
pwd
./words 2>&1
und posten Sie die Ausgabe. So erfahren Sie, ob das Programm ausgeführt wird und ob es abstürzt.
Überprüfen Sie außerdem, ob der Benutzer www-data
bzw. das ausführende Programm auf ./words
die Datenbank zugreifen kann ( ./words
sofern vorhanden).
Antwort2
Versuchen Sie, nicht das Programm selbst auszuführen, sondern ein Skript, das dieses Programm ausführt und seine Umgebung und STDERR-Ausgabe protokolliert.
Sie hätten auch einen Blick in die Protokolle Ihres Webservers werfen sollen.
Antwort3
ähm... ich bin ein absoluter Anfänger im Programmieren, aber... vielleicht das Programm auf dem Webserver kompilieren? Oder eine virtuelle Maschine mit derselben Konfiguration erstellen, die Sie auf dem Webserver ausführen, um den Code dort zu kompilieren.
Weil einer x86 und der andere i686 ist, richtig?