Frage: cgi-bin Verzeichnis für CGI Shell-Skript

MatthiasQL

Neuer User
Mitglied seit
31 Okt 2009
Beiträge
31
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich habe vor kurzem Freetz erfolgreich auf meiner
FRITZ!Box Fon WLAN 7270 v3 installiert. Da ich mich nun etwas mit
der Shellskriptprogrammierung beschäftigen wollte, bin ich auf eine Frage/Problem mit dem cgi-bin Verzeichnis gestoßen.

Ich möchte zum Anfang ein Skript wie z.B. dieses:

Code:
#!/bin/sh
OUTPUT="$(date)"
 echo "Content-type: text/html"
 echo ""
 echo "<html><head><title>Demo</title></head><body>"
 echo "Today is $OUTPUT <br>"
 echo "Current directory is $(pwd) <br>"
 echo "Shell Script name is $0"
 echo "</body></html>"

über einen Browser aufrufen können. Dazu muss ich es in das cgi-bin Verzeichnis kopieren (soviel weiss ich schonmal...). Da aber das /usr/lib/cgi-bin Verzeichnis nur lesbar ist (dies wäre doch das richtige cgi-bin Verzeichnis??) weiss ich nicht so recht weiter.
In anderen Threads habe ich sowas gelesen wie "im Verzeichnis (z.B.: /var/media/ftp/uStor01/[..]/cgi-bin auf dem stick oder irgendwo anders in einem Verzeichnis Namens cgi-bin auspacken und execute Rechte setzen".
Dies habe ich probiert bin aber nicht erfolgreich gewesen - wenn ich im Browser http://192.168.178.1:8008/test.sh eingebe, also den Pfad zum Skript, versucht mein Browser die Datei nur zu speichern, aber nicht auszuführen!!

Kann mir jemand bitte kurz erklären, ob und wo ich ein cgi-bin selbst für mein Skript erzeugen kann? Muss ich das dann noch in einer Config-Datei meines lighttpd eintragen?
Muss das Skript .sh (ist ein Shell Skript) oder .cgi heissen?

Vielen Dank für alle Antworten!
 
Wenn du die Freetz-Webserver-Möglichkeiten nutzen willst und die Sache nin /usr/lib/cgi-bin ablegen willst, so musst du das _vor_ dem Packen und Flashen der Firmware erledigen. da wäre dann fwmod_custom der richtige Ort.
Ansonsten musst du - allgemeingültig gesprochen - deinen Browser so konfigurieren, dass er versteht, was du in das Verzeichnis reinpackst, und dass er die Sachen erreichen kann.
Wie du die Endungen konfigurierst, ist dabei eigentlich dir überlassen, nur muss deine Servervorgabe mit deiner Endung übereinstimmen.

Da du aber den Lighttp nutzt: Was sagt dir denn die Dokumentation zu dem Server? Was muss da rein, damit er Shellscripte interpretiert? Dazu gibt es doch sicherlich was im Netz, oder? Ebenso wie die Feinheiten der CGI-Scripterei allgemein. Auch wie das "DocumentRoot" deines Lighty auszusehen hat, kannst du daraus erkennen...
 
Ich habe mal weiterprobiert und weitergegoogelt...

Diese Anleitung habe ich unter Anderem gefunden
http://www.cyberciti.biz/tips/executing-linuxunix-commands-from-web-page-part-i.html

und sie leicht an meine Bedürfnisse angepasst. Folgendes beinhaltet nun die hello.cgi Datei, welche ich in meinem Document root Verzeichnis erzeugt habe:

Code:
#!/bin/ash
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Testpage</title></head><body>"
echo "<h1>Hello world</h1>"
echo "</body></html>"


Wenn ich diese Datei nun in meinem Browser (Firefox 3.0.15) aufrufe kommt nur eine weisse Seite, wenn ich ein paar Mal auf Reload klicke, kommen immer wieder weisse Seiten bis nach ein paar Mal probieren ein
"500 - Internal Server Error" kommt.

Wenn ich die Datei in hello.sh umbenenne, versucht sie mein Browser beim Aufruf nur runterzuladen und nicht auszuführen.

Ich habe schon etwas im Netz gesucht und gelesen, bloß bin ich immer
noch nicht schlauer, ob ich nochwas in meiner lighttpd.conf anpassen muss -
in den Beispielen die ich gefunden habe, stand nichts davon.
Folgendermaßen sieht sie aus:

Code:
server.modules = ( "mod_access" )
index-file.names = ( "index.cgi", "index.html", "index.htm", "default.htm", "index.php", "index.rb" )
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jar" => "application/x-java-archive",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
"" => "application/octet-stream",
)
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".rb", ".cgi" )
server.port = 8008
server.pid-file = "/var/run/lighttpd.pid"
server.username = "wwwrun"
server.groupname = "wwwrun"
connection.kbytes-per-second = 0
server.kbytes-per-second = 0
server.chroot = "/var/media/ftp/uStor01/www/htdocs"
dir-listing.activate = "disable"
dir-listing.encoding = "utf-8"
server.modules += ( "mod_cgi" )
cgi.assign = ( ".cgi" => "", "/cgi-bin/" => "" )
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" => (( "socket" => "/var/run/lighttpd/php-fastcgi.socket", "bin-path" => "/usr/bin/php-cgi", "max-procs" => 3 )) )
server.document-root = "/websites"


Hat jemand eine Idee oder einen Hinweis für mich?
 
Damit gehts (Kommandozeile)

Code:
httpd -P /var/run/deine.pid -p fritz.box:8001 -h /var/media/ftp/uStor01/deineRoot
chmod +x deineRoot/cgi-bin/*.cgi

auf dem Stick:

deineRoot/*.html
deineRoot/cgi-bin/*.cgi
 
Vielen Dank schonmal...aber...hmm, ich weiss was eine PID ist, aber
was meinst Du mit "deine.pid"?
 
schreib halt matthiasql.pid oder sonst was, Haupsache, die gibt es noch nicht. Der prozess legt die datei selber an und schreibt seine Prozess-ID da rein.

Die findest Du dann unter /var/run
 
Meine Einabe:
httpd -P /var/run/matthiasql.pid -p
fritz.box:8001 -h /var/media/ftp/uStor01/www/htdocs/websites

Ausgabe:
httpd: bad address 'fritz.box:8001'
 
Lass die fritz.box weg:

Code:
httpd -P /var/run/matthiasql.pid -p :8001 -h /var/media/ftp/uStor01/www/htdocs/websites

oder gib die IP des Box - Interfaces an, wohin der deamon binden soll

Code:
httpd -P /var/run/matthiasql.pid -p 192.168.1.1:8001 -h /var/media/ftp/uStor01/www/htdocs/websites
 
Müssen cgis nicht nach /cgi-bin/ ?

MfG Oliver
 
ja, cgi's müssen nach cgi-bin, aber die root für den httpd muss eine Ebene höher gesetzt werden:


z.B httpd auf .../uStor01/www

und die cgi's nach

.../uStor01/www/cgi-bin
 
Bin grade auch am rumprobieren....Dateien mit der Endung .cgi werden problemlos erkannt, doch Dateien im Ordner /cgi-bin ohne die Endung werden versucht heruntergeladen zu werden.....finde nicht die passende Einstellung (cgi.assign hat bis jetzt nichts gebracht).
 
Das liegt sicher an den MIME Types für den Server.
Nenn doch Deine cgi's einfach cgi und gut is.

Außerdem gibt es für cgi ein Protokoll, das einzuhalten ist:

Code:
	echo "Content-type: text/html"
	echo ""
	echo "<!DOCTYPE HTML PUBLIC..."
Die ersten 2 Zeilen sind da wichtig!
 
Danke, aber mir geht es darum: Ich möchte alle WebIFs von außen über einen Port (Subdomains) erreichen. Aber das AVM-WebIF/die Config des lighttpd macht hier Probleme, da die cgi´s bei AVM zwar unter cgi-bin liegen, aber keine .cgi Endung haben. Vor allem die Datei webcm wird für alle Seiten des IFs gebraucht (ist übrigens kein Script, sondern ein Binary, aber daran liegt es nicht.)
 
vielleicht hilf ein wrapper - cgi, das dann das script von avm aufruft?
 
Hab ich mir auch schon gedacht, aber das Problem ist, dass das webcm ohne ".cgi" fest in den Links aller AVM-Seiten steht. Somit müsste ich erst alle Pages editieren.
Aber das werde ich in aller Ruhe nochmal ausprobieren, wenn ich Zeit habe...ist ja eher lighttpd-spezifisch.
 
So, ich habe dann mal folgendes (wie cando empfahl) weiterprobiert:

httpd -P /var/run/matthiasql.pid -p 192.168.178.1:8001 -h /var/media/ftp/uStor01/www/htdocs/websites


Dann habe ich das Verzeichnis .../websites/cgi-bin erstellt, meine .cgi und
.sh Dateien dort reingestellt und siehe da, wenn ich sie jetzt im Browser unter

http://192.168.178.1:8001/cgi-bin/hello.sh

aufrufe, werden die Dateien (sowohl .cgi als auch .sh) ausgeführt (allerdings auch nur, wenn sich die Dateien in diesem Verzeichnis befinden) !
Super, so wie ich es wollte. Kann mir nur kurz jemand erklären, was ich mit dem Befehl s.o. eigentlich bewirkt habe? Ich vermute, mein ursprüngliches Problem mit dem lighttpd habe ich nur umgangen und eigentlich nicht gelöst...
 
Du hast damit einen httpd - deamon gestartet, der seine pid in die datei

/var/run/matthiasql.pid

gespeichert hat.

der Schalter -h setzt das home-verzeichnis (die root Deines Webs) auf

/var/media/ftp/uStor01/www/htdocs/websites

der httpd ist so konfiguriert, dass er alles was .cgi heisst und im /cgi-bin liegt und ein execute flag hat, ausführt.

-p 192.168.178.1:8001

gibt die IP Adresse und Das Port, auf dem der deamon hört. Lässt man die ip weg, hört der deamon auf alle Adressen der Box (wenn man mehrere hat z.B. Lan Segment, WLAN-Segment, externe Adresse im Internet, DMZ Segment etc.)

httpd --help listet alle Optionen auf
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,295
Beiträge
2,249,593
Mitglieder
373,893
Neuestes Mitglied
Kukkatto
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.