• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Linux Befehle mit CGI ausführen - was: Linux Befehle mit JavaScript ausführen

Du solltest Dich mal in die Funktionsweise von CGI einlesen.
gut, aber mich hatte der Schlaue hiermit
du musst einen HTTP Header verschicken, eine HTML Seite reicht nicht und ist auch nicht nötig.
auch erst mal verwirrt. Ich dachte er mein, er/sie soll sich einen eigenen minniserver schreiben, der an port 80 lauscht und bei anforderung einfach die daten hardcodet sendet.
das habe ich auch nicht verstanden.Wie meintest Du das?
er meint nur, daß du nhehmen kannst was du willst um deinen output zu erzeugen und nicht mal unbedingt html zurückliefern mußt. du mußt nur deinen Content-type entsprechend setzen, den kann der Server nicht wissen, da du ja ein cgi-script aufrufst, welches einen anderen Content-type besitzt als der von dir gelieferte output.
Der Content-type (und alle anderen header die du angibst) wird dann übrigens vom Server geparst und in den http-header eingebaut, den dann letztendlich der Server verschickt, aber das cgi-script schickt es erst mal an den server, von daher kann man darüber streiten.

Die Liste mit den MIME Typen hat rein gar nichts damit zu tun, was das System ausführen kann, sondern nur welche Dateiendungen wie ausgeliefert werden. Das gilt aber eben nicht für CGI-Skripte, sondern nur für statische Dateien.
ich denke da liegst du falsch, ich denke der server erwartet für die dateiendung pl den MIME Typ "application/x-httpd-cgi", sonst bringt er bei einem POST die meldung "POST to non-script is not supported in Boa.".
einen Versuch ist es wert.

Wenn Du genug Platz hast, für eine Perl Installation, dann kann man das erweitern.
wer sagt dir, daß noch kein perl drauf ist?
@snowy: hast du mal perl -v ausprobiert?

Ansonsten kannst Du auch ein einfaches Shell Skript basteln und glücklich werden.
vielleicht das einfachste.
 
Was muss ich noch ändern?
du willst eigentlich kein post, sondern ein get. (xmlhttprequest auf knopfdruck) aber es sollte auch so gehen.

was ist $date und wo kommt es her?
warum echo << "irgendwas"

EDIT: aber du hast jetzt auch noch einen server laufen? oder was bedeutet
dazu noch ein Shellskript info.sh in dem Verzeichnis welches bei index.html angegeben ist:
 
Zuletzt bearbeitet:
Code:
#Datumsausgabe

echo << "Content-type: text/html"
echo << '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">'"
echo << "<html><head><title>CGI-Feedback</title></head>"
echo << "<body><h1>CGI-Feedback vom Programm <i>info.sh</i></h1>"
echo << "<p><b>Datum:</b> $date</p>"
echo << "</body></html>"
Was soll denn `echo << blah´ für ein Konstrukt sein?
Und woher soll das Shellskript wissen, was $date für ein Ding ist, wenn Du es benutzt, ohne es voher mit was sinnvollem zu belegen (wie z.B. der Ausgabe von date)

Der Content-type (und alle anderen header die du angibst) wird dann übrigens vom Server geparst und in den http-header eingebaut, den dann letztendlich der Server verschickt, aber das cgi-script schickt es erst mal an den server, von daher kann man darüber streiten.
Das wäre mir neu. Der Server selbst sendet keinerlei Header und parst auch nichts, vielmehr wird die Standardausgabe (stdout) des Skriptes 1:1 an den Browser weitergereicht.

ich denke da liegst du falsch, ich denke der server erwartet für die dateiendung pl den MIME Typ "application/x-httpd-cgi", sonst bringt er bei einem POST die meldung "POST to non-script is not supported in Boa.".
einen Versuch ist es wert.
BOA Server-Doku schrieb:
The MimeTypes <filename> defines what Content-Type Boa will send in an HTTP/1.0 or better transaction.
Wenn man dem Server sagen müßte, dass .pl mit einem bestimmten Mimetyp ausgeliefert wird, dann bräuchte man ihn nicht selbst zu definieren, es sei denn man wollte was anderes ausliefern.

wer sagt dir, daß noch kein perl drauf ist?
Anders als bei Servern, ist der Speicherplatz auf diversen Appliances extrem begrenzt und teuer. Von daher wird sicherlich nur das absolut notwendige installiert sein und das mag ein Minimalsystem sein, mit Kernel, Shell und Webserver.
 
Das wäre mir neu. Der Server selbst sendet keinerlei Header und parst auch nichts, vielmehr wird die Standardausgabe (stdout) des Skriptes 1:1 an den Browser weitergereicht.
der server sendet z.b. Content-Length und Date oder willst du die jedesmal selbst bestimmen. Und er sendet den Server header, oder woher willst du den im cgi wissen?


Wenn man dem Server sagen müßte, dass .pl mit einem bestimmten Mimetyp ausgeliefert wird, dann bräuchte man ihn nicht selbst zu definieren, es sei denn man wollte was anderes ausliefern.
genau deswegen muß man ihn selbst definieren, der output des pl-scriptes ist ein anderer Mime-typ als das pl-script selber


Anders als bei Servern, ist der Speicherplatz auf diversen Appliances extrem begrenzt und teuer. Von daher wird sicherlich nur das absolut notwendige installiert sein und das mag ein Minimalsystem sein, mit Kernel, Shell und Webserver.
das ist eine (nicht unberechtigte) Vermutung.
 
@hesst:

1.perl -v kennt das Steuergerät (WAGO Linux Feldbuskoppler 70-860) nicht.
2.die mime.types habe ich um die eine Zeile für Perl erweitert -> das kleine BSP liefert denselben Fehler

-> das uCLinux kennt also kein Perl.


@all:

1.Das Beispiel mit dem Shellskript hatte ich auf meinem lokalen PC versucht.
Ohne Webserver...blutiger Anfängerfehler:eek:. Werd das jetzt gleich auf dem Zielgerät weiter testen.

2.zum Shellskript:
Ich weiß nicht wie ich die Antwort HTML Seite erzeugen muss die der Webserver dann zurücksendet..
 
Das kleine Beispiel habe ich versucht. Da kommt die gleiche Fehlermeldung wie bei dem Perlskript.

Wenn ich statt Post , Get verwende dann kommt:

404 Not Found
The requested URL /var/www/cgi-bin/info.sh was not found on this server.

Das ist der richtige Pfad auf dem Gerät und der richtige Dateiname...
 
Das kleine Beispiel habe ich versucht. Da kommt die gleiche Fehlermeldung wie bei dem Perlskript.
hast du mal deine mime.types um die zeile
application/x-httpd-cgi sh
erweitert?

Wenn ich statt Post , Get verwende
rufst du das file so im browser auf oder was machst du?
aufrufen mußt du wahrscheinlich xxx.xxx.xxx.xxx/cgi-bin/info.sh. das kommt auf deine konfiguration an.
 
Ja die Zeile hatte ich erweitert.

Habe den Fehler grad gefunden. Es liegt daran das ich /var/www weglassen muss.
Dann findet er das Skript, aber jetzt ein Zugriffsproblem:

403 Forbidden
Your client does not have permission to get URL /cgi-bin/info.sh from this server.

der Nutzer heißt root und das passwort xxxx. Das müsste ich bestimmt jetzt mitsenden.Aber wie?
 
Zuletzt bearbeitet:
der Mime type ist hier nicht relevant, es ist genau wie Albu bereits sagte, diese sind nur wichtig, wenn du eine statische Datei abrufst. Bei einem CGI Skripte muss du den Header selbst erzeugen.

Du musst jetzt noch die Zugriffsrechte setzten, ich nehm an sowas wie 0755 (bin da aber kein Fachmann)
 
der Mime type ist hier nicht relevant, es ist genau wie Albu bereits sagte, diese sind nur wichtig, wenn du eine statische Datei abrufst. Bei einem CGI Skripte muss du den Header selbst erzeugen.
ja, für dessen output. aber das einzige, was in den quellen von seinem server auf die Fehlermeldung hindeutet, ist
in der funktion
/*
* Name: translate_uri
*
* Description: Parse a request's virtual path. Sets path_info,
* query_string, path_translated, and script_name data if it's a
* ScriptAlias or a CGI. Note -- this should be broken up.
*
* Return values:
* 0: failure, close it down
* 1: success, continue
*/
die folgende überprüfung
http://forum.jswelt.de/serverseitig...-befehle-javascript-ausf-hren.html#post286837
es sieht für mich so aus, als würden nur POST's an scripte mit dem entsprechendem type durchgelassen. oder was bedeutet deiner Meinung nach die Fehlermeldung: "POST to non-script is not supported in Boa."?

Ja die Zeile hatte ich erweitert.
und dann einen POST probiert?
 
ich hab nochmal genauer hingesehen. für alle scripte im ScriptAlias directory gibt es vorher einen austieg aus der funktion. den mime-type muß man also nur setzen, wenn man an cgi-scripte außerhalb des cgi-directorys posten will. und da snowy immer auf xxx.xxx.xxx.xxx/var/www/cgi-bin/info.sh anstelle des alias zugegriffen hat, wurde der Fehler geworfen.
 
Das Shellskript - Beispiel funktioniert jetzt!! Danke nochmals für eure Hilfe.

Ich hätte trotzdem interesse daran auch in anderen Skriptsprachen zu arbeiten.
Gibt es da spezielle Sachen für Embedded Systems in Sachen Perl,JavaScript und so weiter?
In Hinblick auf die Installation (welches Verzeichnis?)

VG
 
Ich hätte trotzdem interesse daran auch in anderen Skriptsprachen zu arbeiten.
Gibt es da spezielle Sachen für Embedded Systems in Sachen Perl,JavaScript und so weiter?
In Hinblick auf die Installation (welches Verzeichnis?)
In Javascript kannst Du jetzt schon arbeiten.

Für andere Sprachen wirst Du einen entsprechenden Cross-Compiler brauchen, mit dem Du die Perl- oder PHP-Sourcen für das Gerät übersetzt, oder Du musst eine Quelle mit fertigen Binaries für Deine Architektur auftun. Ich nehme mal an, dass es auch eine entsprechende Entwicklergemeinde gibt, an die Du Dich wenden könntest.

Wieviel Megabytes Platz hast Du denn auf Deinem Gerät noch frei?
 
1.)
"df" auf dem Steuergerät lieferte:

~ # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/mtdblock3 2624 1248 1376 48% /

sind das dann quasi 1,3 MB cirka..?

2.)
Derzeit bekomm ich nur eine weiße Seite mit dem Ergebnis von "ls" zurück, bei betätigen des Buttons auf der index.html - Seite aus dem Beispiel.
Ich möchte gern auf der Startseite eine HTML-Seite haben, die eine Tabelle hat in der bei jeder Zelle das Ergebnis eines Shell-Befehls des Steuergerätes erscheint. Wenn man den Button drückt wird dann einfach ein Refresh gemacht (also die aktuellen Daten holen).

Wie kann ich mir eine HTML Seite zurückgeben lassen?

So habe ich es versucht:

Ausschnitt:
Code:
echo "<title>Antwortseite</title>"
echo 
ls

Mit dem echo Befehl und dem HTML Code erscheint aber nachwievor nur eine weiße Seite ohne HTML Formatierung...

3.)
ein Befehl auf dem Steuergerät lautet "cat meminfo". Dieser liefert pro Zeile einen Speicherbereich mit Speichergröße:
Name1 Wert1
Name2 Wert2
...

Wenn ich diesen Befehl mit in das Shellskript einbaue, bekomme ich als Antwort:
Name1 Wert1 Name2 Wert2 ....

Wie bekomme ich das untereinander?

4.)
Für was steht eig die Abkürzung BOA? Auf Boa.org bin ich nicht fündig geworden.

Vielen Dank!!

Weihnachtliche Grüße
 
Zuletzt bearbeitet:
"df" auf dem Steuergerät lieferte:

sind das dann quasi 1,3 MB cirka..?
Ja.

Wie kann ich mir eine HTML Seite zurückgeben lassen?

So habe ich es versucht:

Ausschnitt:
Code:
echo "<title>Antwortseite</title>"
echo 
ls

Mit dem echo Befehl und dem HTML Code erscheint aber nachwievor nur eine weiße Seite ohne HTML Formatierung...
Du weißt aber wie eine HTML Seite aufgebaut ist? Wenn Du sie nicht erzeugst, dann kommt da auch nix. Kommandozeilen-Tools geben standardmäßig kein HTML aus. Entweder formatierst Du die Ausgabe also entsprechend, oder Du läßt es, wie es ist.

ein Befehl auf dem Steuergerät lautet "cat meminfo". Dieser liefert pro Zeile einen Speicherbereich mit Speichergröße:
Name1 Wert1
Name2 Wert2
...

Wenn ich diesen Befehl mit in das Shellskript einbaue, bekomme ich als Antwort:
Name1 Wert1 Name2 Wert2 ....

Wie bekomme ich das untereinander?
Indem Du daraus korrektes HTML machst, mit Zeilenumbrüchen, die nicht als Whitespace vom Browser "wegoptimiert" werden.

Für was steht eig die Abkürzung BOA? Auf Boa.org bin ich nicht fündig geworden.
Keine Ahnung, aber die haben Logos mit Schlangenmotiven. Vielleicht sind das Fans vom Mowgli.
 
info.sh:

Code:
#!/bin/sh

echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"
echo "<html>"
echo "<head>"
echo "<title>Test</title>"
echo "</head>"
echo "<body bgcolor="#E0E0E0">"
echo "<h1>Test</h1>"
echo "Content-type: text/plain"
echo
ls
echo
cd /
cd proc
cat meminfo
echo
echo "</form>"
echo "</body>"
echo "</html>"

Es wir trotzdem keine HTML Seite zurück geliefert.

Oder meintest Du ich muss direkt eine neue index.html Seite aus dem Shellskript erzeugen. Die andere damit ersetzen und den Browser refreshen?
 
Du solltest Dir mal den Unterschied zwischen HTTP und HTML anschauen. Du scheinst die beiden irgendwie zu vermischen.
Im Bezug auf HTTP stellen HTML Tags lediglich Nutzdaten dar.
Über HTTP muß man eigentlich nichts wissen. In der Regel reicht es aus das man weiß, das der Content-type gesetzt werden muß. Du scheinst HTTP und CGI zu vermischen.

Wie kann ich mir eine HTML Seite zurückgeben
am anfang eines cgi-script's kannst du verschiedene einträge die in den http-header eingefügt werden sollen durch newline getrennt einfügen. das ende dieses block's kennzeichnest du durch eine leerzeile (newline). hier reicht idR der Content-type, wie oben schon beschrieben.
dann schreibst du deinen html-code in den output.

PHP:
#!/bin/sh
echo "Content-type: text/html"
echo
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"
echo "<html>"
echo "  <head>"
echo "    <title>test</title>"
echo "  </head>"
echo "  <body>"
echo "    irgendwas"
echo "  </body>"
echo "</html>"

[\php]

[QUOTE="snowy, post: 286996, member: 25432"]
ein Befehl auf dem Steuergerät lautet "cat meminfo". Dieser liefert pro Zeile einen Speicherbereich mit Speichergröße:
Name1 Wert1
Name2 Wert2
...

Wenn ich diesen Befehl mit in das Shellskript einbaue, bekomme ich als Antwort:
Name1 Wert1 Name2 Wert2 ....

Wie bekomme ich das untereinander?[/QUOTE]

du mußt den output irgendwie formatieren. hast du sed auf der kiste? dann z.B. so, gleich als tabellen zeilen
[code]
sed -n 's/\(.*\): *\([0-9]\+\) kB/<tr><td>\1<\/td><td>\2<\/td><\/tr>/p' </proc/meminfo
[\code]
da packst du noch eine tabelle drum und fertig.
[php]
#!/bin/sh
echo "Content-type: text/html"
echo
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"
echo "<html>"
echo "  <head>"
echo "    <title>test</title>"
echo "  </head>"
echo "  <body>"
echo "    <h1>Test</h1>"
echo "    <table>"
sed -n 's/\(.*\): *\([0-9]\+\) kB/<tr><td>\1<\/td><td>\2<\/td><\/tr>/p' </proc/meminfo
echo "    </table>"
echo "  </body>"
echo "</html>"
 
Zuletzt bearbeitet:
Zurück
Oben