Exe als CGI ausführen

Hallo Leute,

ich habe ein Problem, dass schon mehrmals diskutiert worden ist, aber bisher konnte ich keine Lösung finden.

Ich benutze den thttpd als Webserver und möchte nun aus diesem heraus eine Exe-datei starten als wenn es ein CGI script wäre.

Sobald ich normale Linuxscripte benutze werden diese auch durch:

ausgeführt.

Verbirgt sich jedoch hinter der cgiScriptExe.cgi ein executable, dann bekomme ich einen Serverfehler.

Ich wäre dankbar, wenn mir jemand helfen könnte das Problem zu lösen, denn für das geplante Unterfangen ist dieses Vorgehen unabdingbar.

Vielen Dank euch,
Grüße,
Ai

Hallo Ai,

der Perl-Interpreter erwartet natürlich einen script im text-format.

Wenn Du eine EXE-Datei aufrufen willst, dann mache das im Script mit system („datei.exe“)

Gruß
Klaus

Ich benutze den thttpd als Webserver und möchte nun aus diesem
heraus eine Exe-datei starten als wenn es ein CGI script wäre.

Sobald ich normale Linuxscripte benutze werden diese auch
durch:

Linux und EXE ?

Verbirgt sich jedoch hinter der cgiScriptExe.cgi ein
executable, dann bekomme ich einen Serverfehler.

soviel ich lese ist das eine linux version .
Ist deine exe denn auch für linux gedacht ?
oder nutzt du emulierer Wine dafür ?

oder ist das ein apache modul in einem Windows Server ?

Mir noch etws schleierhaft.

Ich benutze den thttpd als Webserver und möchte nun aus diesem
heraus eine Exe-datei starten als wenn es ein CGI script wäre.

Sobald ich normale Linuxscripte benutze werden diese auch
durch:

Linux und EXE ?

Vielleicht habe ich es etwas flapsig geschrieben. In linux gibt es auch datein, die als Executable markiert sind. Diese meine ich natürlich. (-x)

Verbirgt sich jedoch hinter der cgiScriptExe.cgi ein
executable, dann bekomme ich einen Serverfehler.

soviel ich lese ist das eine linux version .
Ist deine exe denn auch für linux gedacht ?
oder nutzt du emulierer Wine dafür ?

Meine Executable ist mit gcc auf Linux kompiliert und läuft ohne Probleme. Kein Wine benötigt.

oder ist das ein apache modul in einem Windows Server ?

Nein, es ist wirklich der httpd für Linux.

Mir noch etws schleierhaft.

Danke für deine Antwort.

Grüße,
Andy

Heißt CGI = Perl? Das wäre mir neu. Ich habe leider kein Perl zur Verfügung. Die Software läuft auf einem Embedded-System mit minimalen Möglichkeiten.

Grüße,
Andy

Hallo,

Verbirgt sich jedoch hinter der cgiScriptExe.cgi ein
executable, dann bekomme ich einen Serverfehler.

Wenn du einen Fehler bekommst, schaue in die Fehler-Logdatei. Die enthält mehr Information.

Bei Apache2 liegt die üblicherweise in /var/log/apache2/error.log (wo genau sie ist, steht in der Konfigurationsdatei des Servers).

Im Prinzip spricht nichs dagegen, eine ELF executable für CGI zu benutzen, allerdings muss das Programm sich natürlich an das CGI-Protokoll halten (und z.B. einen Content-Type header ausgeben).

Grüße,
Moritz

Heißt CGI = Perl? Das wäre mir neu.

mir auch :smile:)

aber die extensionen cgi und pl sind standardmäßig dem perl-interpreter zugeordnet.

wobei … jeder admin kann seine mime-typen ja beliebig zuordnen.

ich glaube, deine anfrage ist im grunde kein perl problem

gruß
klaus

Hallo,

Heißt CGI = Perl? Das wäre mir neu.

mir auch :smile:)

aber die extensionen cgi und pl sind standardmäßig dem
perl-interpreter zugeordnet.

wobei … jeder admin kann seine mime-typen ja beliebig
zuordnen.

Ich glaube nicht, dass das viel mit mime-typen zu tun hat.

Unter Unix-System fuehrt der Webserver CGI-Skripte einfach aus, und der Kernel schaut sich die shebang-Zeile an, um den richtigen Interpreter zu finden.

Unter Windows muss (zumindest beim IIS) der Interpreter extra konfiguriert werden.

ich glaube, deine anfrage ist im grunde kein perl problem

Hat auch niemand behauptet - CGI ist auch Thema dieses Bretts, nicht nur Perl.

Gruesse,
Moritz

Hallo Moritz,

danke für den Tipp. Die Log Datei kann ich erst nächste Woche auslesen, weil ich diese nicht auf Arbeit bin. Dann werde ich mich sicher nochmal melden.
Ich bin mir auch 100%ig sicher, dass ich den richtigen Header ausgegeben habe (Content-type: text/html\n\n).

  1. Quellcode erstellt
  2. mit gcc kompilliert
  3. in den cgi-bin ordner kopiert
  4. in der HTML datei verweisen (form action = … etc)

Das sollte es eigentlich sein meiner Meinung nach und Danke, dass du bestätigst, dass es funktionieren müsste.

Ich schau mir die log Datei dann an.

Grüße,
Ai

Hallo Moritz,

hier nochmal die Konkreten Informationen. Ich habe einen Button. Hier der zugehörige Quellcode:

Nach dem Drücken bekomme ich einen Serverfehler 500:

500 Internal Error
There was an unusual problem serving the requested URL '/cgi-bin/jsCGITest.cgi'.
thttpd/2.25b 29dec2003

In der Logdatei steht dazu folgender Eintrag:

10.220.8.82 - - [25/May/2009:03:55:28 +0100] "POST /cgi-bin/jsCGITest.cgi HTTP/1.1"
200 25000 "http://192.168.11.195/" "Mozilla/5.0 (Windows; U; Windows
NT 5.1;de; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)"

Daraus kann ich leider nix ableiten :frowning:

Grüße,
Andy

Hallo,

10.220.8.82 - - [25/May/2009:03:55:28 +0100] „POST
/cgi-bin/jsCGITest.cgi HTTP/1.1“
200 25000 „http://192.168.11.195/“ „Mozilla/5.0 (Windows; U;
Windows
NT 5.1;de; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR
3.5.30729)“

Das sieht nach access.log aus, nicht nach error.log

Was kommt als ausgabe, wenn du das Script auf der Kommandozeile ausfuehrst?

also im document root

./cgi-bin/jsCGITest.cgi

ausfuehren

Gruesse,
Moritz

Hey Moritz,

Hallo,

10.220.8.82 - - [25/May/2009:03:55:28 +0100] „POST
/cgi-bin/jsCGITest.cgi HTTP/1.1“
200 25000 „http://192.168.11.195/“ „Mozilla/5.0 (Windows; U;
Windows
NT 5.1;de; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR
3.5.30729)“

Das sieht nach access.log aus, nicht nach error.log

also in der Configurationsdatei steht:

cgipat=/cgi-bin/\*.cgi
logfile=/var/www/logs/thttpd.log
pidfile=/var/run/thttpd.pid

Von daher ging ich davon aus, dass ich darin nachschauen muss.
Konnte auch keine andere Option finden, die access von error trennt.

Was kommt als ausgabe, wenn du das Script auf der
Kommandozeile ausfuehrst?

also im document root

./cgi-bin/jsCGITest.cgi

ausfuehren

Die Ausgabe ist dann folgende:

Content-type: text/html

CGI-Feedback CGI-Feedback vom Programm
Name: Andy
Kommentartext: Kommentar

Gruesse,
Moritz

Grüße,
Andy

Hallo,

ist das Problem durch die vorigen Antworten jetzt schon gelöst oder noch nicht.

Fehler 500 wird ja noch vom Server (thttpd) selbst erzeugt. Folgerung: das Executable erzeugt etwas, das thttpd nicht erwartet. Es kommen also nur Fehler in Betracht, die direkt mit dem Executable zu tun haben.

Um das rauszudebuggen folgender Vorschlag:

erzeuge ein Shell-Skript, das die analoge Ausgabe erzeugt wie die „echte“ EXE.

#!/bin/sh
echo 

...

EOTEST

Executable setzen und mal ausprobieren, ob der gleiche Text-Output rauskommt. Dann im Web-Formular mal auf die Shell-Skript Variante verweisen. Geht das? Falls nein erwartet thttpd vielleicht noch zwingend irgendwelche weiteren Header (Content-Length oder andere).

Nächster Verdacht: stimmt die Datei Ownership. Manchmal verlangen Webserver für das Ausführen von CGIs bestimmte Limitationen. Z.B. nicht executable für „other“ oder „ownership“ des Skripts = user unter dem thttpd läuft, …

Viele Grüße
maba

Hallo,

Hallo Maba,

danke für deine Vorschläge. Ich bin denen nachgegangen.

ist das Problem durch die vorigen Antworten jetzt schon gelöst
oder noch nicht.

Das Problem ist leider immer noch nicht gelöst.

Fehler 500 wird ja noch vom Server (thttpd) selbst erzeugt.
Folgerung: das Executable erzeugt etwas, das thttpd nicht
erwartet. Es kommen also nur Fehler in Betracht, die direkt
mit dem Executable zu tun haben.

Um das rauszudebuggen folgender Vorschlag:

erzeuge ein Shell-Skript, das die analoge Ausgabe erzeugt wie
die „echte“ EXE.

#!/bin/sh
echo

EOTEST

Executable setzen und mal ausprobieren, ob der gleiche
Text-Output rauskommt. Dann im Web-Formular mal auf die
Shell-Skript Variante verweisen. Geht das? Falls nein erwartet
thttpd vielleicht noch zwingend irgendwelche weiteren Header
(Content-Length oder andere).

Wenn ich das gleiche in ein Shellskript packe, dann funktioniert alles wunderbar! Ich bekomme die gewünschte html Seite angezeigt.

Nächster Verdacht: stimmt die Datei Ownership. Manchmal
verlangen Webserver für das Ausführen von CGIs bestimmte
Limitationen. Z.B. nicht executable für „other“ oder
„ownership“ des Skripts = user unter dem thttpd läuft, …

Ich habe heute eine Seite gefunden (http://www.boristheengineer.co.uk/slug/thttpd_web_se…), auf der erklärt wird, dass thttpd sehr wählerisch sein soll, was Zugriffsrechte angeht. Leider funktionieren die dort vorgeschlagenen Settings nicht.

Meine CGI Datei hat folgende Rechte:

-rwx--x--x+ 1 t0112387 cc\_lzb 5182 Nov 2 12:59 jsCGITest.cgi

Die zugehörige Konfiguration setzt user root als user.

dir=/var/www/data
user=root
# localpat=\*\*.gif|\*\*.png|\*\*.jpg
cgipat=/cgi-bin/\*.cgi
logfile=/var/www/logs/thttpd.log
pidfile=/var/run/thttpd.pid

Ich für meinen Teil sehe dort keine Konflikte in den Rechten.

Viele Grüße
maba

Vielen Dank für deine Antwort!!!

Grüße,
Andy

Hallo,

Hey Morit

Das sieht nach access.log aus, nicht nach error.log

also in der Configurationsdatei steht:

cgipat=/cgi-bin/*.cgi
logfile=/var/www/logs/thttpd.log
pidfile=/var/run/thttpd.pid

Von daher ging ich davon aus, dass ich darin nachschauen muss.
Konnte auch keine andere Option finden, die access von error
trennt.

Eine Google-Suche hat ergeben:

If you’d rather log directly to a file, you can use the -l
command-line flag. But note that error messages still go
to syslog.

von http://www.acme.com/software/thttpd/thttpd_man.html#…

Also mal /var/log/syslog schauen, ob da was interessanteres drin steht.

Content-type: text/html

CGI-Feedback
CGI-Feedback vom Programm
Name: Andy
Kommentartext: Kommentar

Sieht ganz gut aus.
Noch eine winzige Idee: probier mal die beiden \n nach dem Header durch \r\n zu ersetzen. Ich glaube nicht, dass es was bringt, aber probieren kann man es.

Gruesse,
Moritz

Guten Morgen,

Hallo,

Hey Morit

Das sieht nach access.log aus, nicht nach error.log

also in der Configurationsdatei steht:

cgipat=/cgi-bin/*.cgi
logfile=/var/www/logs/thttpd.log
pidfile=/var/run/thttpd.pid

Von daher ging ich davon aus, dass ich darin nachschauen muss.
Konnte auch keine andere Option finden, die access von error
trennt.

Eine Google-Suche hat ergeben:

If you’d rather log directly to a file, you can use the -l
command-line flag. But note that error messages still go
to syslog.

von http://www.acme.com/software/thttpd/thttpd_man.html#…

Also mal /var/log/syslog schauen, ob da was interessanteres
drin steht.

Na das ist doch mal was! In /var/log/messages steht folgendes:

May 26 00:57:26.994376 ec320 thttpd[180]: execve
cgi-bin/jsCGITest.cgi - Exec format error

was das allerdings bedeuten soll weiß ich nicht und hab auch nix gefunden…

Content-type: text/html

CGI-Feedback
CGI-Feedback vom Programm
Name: Andy
Kommentartext: Kommentar

Sieht ganz gut aus.
Noch eine winzige Idee: probier mal die beiden \n nach dem
Header durch \r\n zu ersetzen. Ich glaube nicht, dass es was
bringt, aber probieren kann man es.

Die Ersetzung hat leider nix gebracht. Gleiche Reaktionen, nur, dass mein CGI script nun folgendes enthält:

printf("Content-type: text/html\r\n");
printf("\r\n");
printf("\r\n");
printf("\r\n");
printf(" Hallo Welt \r\n");
printf("\r\n");
printf("");

Gruesse,
Moritz

Grüße,
Andy

Hey Leute,

ich sage euch allen ein großes DANKESCHÖN für eure Hilfe!
Ich habe nun gefunden woran es lag. Der Erroreintrag in var/log/messages hat mich auf die richtige Spur gebracht.

Unzwar war das eigentliche Problem, dass das executable nicht lauffähig ist, weil es auf einem anderen Unix System gebaut wurde. Ich wusste nicht, dass unsere Entwicklungsmaschine einen Compiler verwendet, der für das Targetsystem nicht funktionierende Executables erzeugt.

Nun habe ich einen Crosscompiler mit den entsprechenden Optionen benutzt und siehe da: ES GEHT.

Also nochmal vielen, vielen Dank an euch.

Liebe Grüße,
Andy

In der Doku werden als Berechtigungen in der Tat
rwx–x--x
oder
rwxr-xr-x
vorgeschlagen. In wieweit die Datei-Ownership eine Rolle spielt weiß ich nicht. Die thttpd Doku ist da unspezifisch. Aber - wenn das Shell-Skript gleichen Inhalts das richtige tut, müßte das Executable mit gleicher Ownership und gleichen Berechtigungen auch wieder das gleiche tun.

Ein weiterer Test, den man machen könnte: einen Shell-Wrapper um die EXE.

Also

#!/bin/sh
./echtes-executable.cgi

Eventuell sieht man dann, wo das Problem liegt. Ein weiterer Punkt: Falls das Executable shared libraries verwendet, die außerhalb von /lib und /usr/lib liegen, dann muß LD_LIBRARY_PATH gesetzt werden. Die CGI-Programme laufen ja in einem sehr limitierten Environment.

Viele Grüße
Maba

Na das ist doch mal was! In /var/log/messages steht folgendes:

May 26 00:57:26.994376 ec320 thttpd[180]: execve
cgi-bin/jsCGITest.cgi - Exec format error

was das allerdings bedeuten soll weiß ich nicht und hab auch
nix gefunden…

Grüße,
Andy

Ich habe jetzt auch mal diesen zweiten Zweig weitergelesen. Da hat sich ja auch einiges getan.

Zunächst auch hier eine Frage. Die printf Befehle sehen nach Perl aus. Ist das Executable denn nun ein Perl-Skript oder ein echt kompiliertes Executable?

Das Perl-Skript sollte sich identisch verhalten wie das Shell-Skript (siehe anderer Zweig), solange in der ersten Zeile das korrekte Shebang steht.

#!/usr/bin/perl
oder
#!/usr/local/bin/perl
oder
... eben dort wo das Perl executable installiert ist

Falls es sich nicht gleich verhält, liegt die Vermutung nahe, daß Perl nicht korrekt ausgeführt werden kann. Dazu müßte man von der Kommandozeile mal „perl -v“ ausführen, um zu sehen ob Perl an sich funktioniert. Ansonsten wie bei der Shell-Skript Variante mal einen Environment Vergleich machen. Sind die Library-Pfade gesetzt? Sind alle notwendigen anderen Environment-Variablen korrekt (PATH, …).

Nächste Frage: wie kommt das Executable in den CGI-Pfad. Wenn execve meckert, daß das Format nicht korrekt sei, dann könnte es sein, daß das Executable nicht lokal auf der Maschine kompiliert wurde sondern mittels FTP oder anderen Tools übertragen wurde. Dabei könnte ein Fehler aufgetreten sein, der zu einer korrupten Exe führt (Binary / ASCII Transfer).

Viele Grüße
Maba

Hey Maba,

vielen Dank für deine Antworten. Bitte ließ noch das hier:

http://www.wer-weiss-was.de/app/service/board_navi?A…

Grüße,
Andy