Shell-Workshop (12)

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
In diesem Workshop basteln wir uns ein cgi-Skript.

Was ist ein cgi-Skript? cgi = commom gateway interface ... bezeichnet ein Programm, welches von einem Web-Server ausgeführt werden kann/darf. Also wir wollen, dass unser system-Apache ein Shell-Skript ausführt und die Ausgabe zu einem Webbrowser hinschiebt und anzeigt.

Damit der System-Apache das cgi-Skript ausführen kann, schreibt man es am besten ein ein eigenes Verzeichnis unter '/usr/syno/synoman/webman/3rdparty/' - nennen wir das Verzeichnis 'ws' für 'workshop':

Rich (BBCode):
Syno> mkdir /usr/syno/synoman/webman/3rdparty/ws
Syno> cd /usr/syno/synoman/webman/3rdparty/ws
Syno> pwd
/usr/syno/synoman/webman/3rdparty/ws

Damit das cgi-Skript auch vom Webserver dem richtigen Kommandointerpreter vorlegt wird, schreiben wir in die erste Zeile die Shebang-Anweisung. Damit die Webseite auch regelgerecht aufgebaut ist, brauchen wir noch einen Header und eine Leerzeile. Hierfür verwenden wir den 'echo -e', denn dieser kann auch Zeilenvorschübe per Metazeichen (\n):
Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body>huhu</body></html>'
Syno>

Ich habs jetzt nicht hingeschrieben, aber beenden tun wir die Eingabe des 'cat' mit einem <Strg-D>. Jetzt müssen wir die Datei noch mit einem chmod +x 'executeable' machen:

Rich (BBCode):
Syno> chmod +x test1.cgi

Und nun können wir diese Datei im Browser aufrufen:
Rich (BBCode):
http://syno:5000/webman/3rdparty/ws/test1.cgi

Natürlich muss an die Stelle, wo beim mir 'syno' steht, entweder der richtige Name der DS stehen oder die IP-Adresse. Und klar der Port 5000 muss freigeschaltet sein ...

Wenn alles ok ist, dann müsste im Browser der Text 'huhu' stehen und im Browser-Fenster-Rand der Text 'Workshop' vorkommen (title).

Wie können wir nun etwas anderes ausgeben, als einen Text? Also z.B. eine Prozessliste?

Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body>'
ps
echo -e '</body></html>'
Syno>

Na das sieht jetzt nicht gerade übersichtlich aus. Also das muss noch Format rein: <pre> gibt auch Leerstellen und Zeilenvorschübe richtig hübsch aus.

Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body><pre>'
ps
echo -e '</pre></body></html>'
Syno>

Wenn uns nur spezielle Zeilen des ps interessieren, dann kann man diese per 'grep' heraus filtern:

Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body><pre>'
ps | grep "httpd"
echo -e '</pre></body></html>'
Syno>

Unschön ist, dass auch die Zeile mit dem 'grep' erscheint. Aber das kann man mit einem inversen 'egrep -v grep' richten.

Jetzt fehlt noch die Spaltenbeschriftung. 'head -1' hilft.

Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body><pre>'
ps | head -1
ps | grep "httpd"
echo -e '</pre></body></html>'
Syno>

Nun wollen wir sicherlich nicht immer die 'httpd'-Prozessinformationen, sondern halt die, die wir gerade haben wollen. In der URL kann man den Query-String benutzen, um beim Aufruf Parameter mitzugeben.
Rich (BBCode):
http://syno:5000/webman/3rdparty/ws/test1.cgi?httpd

In unserem cgi-Skript können wir darauf per Shell-Variablen 'QUERY_STRING' zugreifen.

Rich (BBCode):
Syno> cat >test1.cgi
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body><pre>'
ps | head -1
ps | grep "$QUERY_STRING"
echo -e '</pre></body></html>'
Syno>

Statt 'httpd' geht jetzt auch 'inetd' oder 'init' oder oder ... Nur wenn was Nicht-Vorhandenes eingeben wird, dann wird nur die Überschrift ausgegeben.

=======

Viel Spaß beim cgi-Skripten. Wer möchte, kann ja mal den ipkg-ps einbauen. Und vielleicht könnte auch jemand eine Idee haben, wie man die doppelte Spaltenüberschrift wegbekommt, wenn man keinen Query-Search-String eingibt.

Itari


=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.

Shell-Workshop (11)
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
"ps | head -1" mag er hier nicht, "ps | head -n 1" geht.


Lösung für doppelte Header (markieren zum Anzeigen), auch wenn dies bislang noch nicht im Workshop behandelt wurde.
Rich (BBCode):
#!/bin/sh
echo -e 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body><pre>';
if [ -n "$QUERY_STRING" ]
then
  ps | head -n 1
fi

ps | grep "$QUERY_STRING" | egrep -v grep
echo -e '</pre></body></html>'
                                                                                              
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
"ps | head -1" mag er hier nicht, "ps | head -n 1" geht.

Also bei mir schon ... siehe Bildchen.

ws_head.png

Aber trotzdem danke für den Hinweis.

Die 'versteckte' Lösung gefällt mir.

Itari
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Wer mag, kann ja auch mal ein ebensolches Skript zum Anlisten der /var/log/messages schreiben, eventuell mir dem Zusatz, dass man sich die x-letzten Zeilen dieser Datei anschauen kann. Statt 'head' kann man dafür 'tail' verwenden.

Itari
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Ich seh gerade, mein head ist von /opt, dürfte wohl daran liegen.
 

Binomico

Benutzer
Mitglied seit
01. Jun 2010
Beiträge
573
Punkte für Reaktionen
0
Punkte
0
Mich hat, nach dem Shell-Einführungskurs, im Allgemeinen wie im Speziellen, gerade diese Seite ein gutes Stück weiter gebracht.

Wenn du dich intensiver mit Unix/Linux beschäftigen möchtest, ist dieses Script echt klasse! Weiterbildendes Nachschlagewerk mit super viel Input.

btw ... vermutlich ist *fast* jeder IT-Freak schon mal über die Seite gestolpert, bisher hab ich den Unix-Teil nur leider sehr gekonnt umgangen :/
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
404-Error beim Aufruf von cgi

Beim Aufruf von http://syno:5000/webman/3rdparty/ws/test1.cgi kommt 404-Error (Seite nicht gefunden). :(
Wenn ich im gleichen Verzeichnis html-Datei abspeichere, wird sie problemlos angezeigt.
Weisst jemand, wie ich das Problem lösen kann?

Danke

Gruss

Katja
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Dateirechte und Linux-Zeilenendeneditor fallen mir als erstes ein ...

Itari

was meinst Du unter Linux-Zeilenendeneditor? Das Problem kenne ich gar nicht.

PS: ich habe meine CGI im windows notepad++ gespeichert, hat leider nichts gebracht :-(
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
was meinst Du unter Linux-Zeilenendeneditor? Das Problem kenne ich gar nicht.

Die Zeilenenden sind je nach Betriebssystem Linux, MSDOS/Windows, Mac halt unterschiedlich (CR, LF und Kombi). Die Linux-Shell (und das wird ja per SHE-Bang "#!/bin/sh" eingefordert) wird ja für das Skript als Interpreter aufgerufen und die mag nur Linux-Zeilenenden, ansonsten verweigert sie die Arbeit und der Apache bekommt dann auch keine Daten, die er durchreichen kann an den Browser ... also mosert er herum

Itari
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Hallo Itari,

danke erstmal für deine Hilfe. Jetzt habe ich das endlich hingekriegt. Der blöde Fehler war, dass ich <html>-tag im Code falsch bzw. doppelt gesetzt habe.

Mein eigentlicher Ziel ist python-Script in web laufen zu lassen. Wenn ich folgenden Code in cgi-Datei einpacke, kriege ich wieder die bekannte 404-Fehlermeldung.

#!/usr/bin/env python
print 'Content-type: text/html\n\n<html><head><title>Workshop</title></head><body>test test</body></html>'


Hast Du eine Idee, woran es liegen kann?
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hast Du eine Idee, woran es liegen kann?

Warum schreibst den shebang nicht als Pfad, der direkt auf Python zeigt? Ich hab kein Python installiert, denke mir aber, dass es so aussehen könnte: #!/opt/bin/python

Itari
 

>dev/null

Benutzer
Mitglied seit
07. Nov 2011
Beiträge
12
Punkte für Reaktionen
0
Punkte
0
Coole Idee !
Vorallem z.B /var/log/messages auszugeben. :eek:
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
#!/opt/bin/python hilft leider nicht...
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Hast mal dein Python gesucht? Vielleicht liegt das ja in einem eigenen Verzeichnis oder heisst irgendwie anders ???

Itari
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
> which python ergibt /opt/bin/
Also, der Pfad ist schon richtig.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
was passiert, wenn du das Skript auf der Linux-Kommandozeile aufrufts?

Itari
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Aus der Konsole auf der DS kann ich mein Script nur mit >python datei.cgi ausführen (nicht mit >sh datei.cgi oder >./datei.sh)
 

kakoh

Benutzer
Mitglied seit
29. Feb 2012
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
jetzt habe ich hingekriegt, dass in der Konsole >./datei.py ausgeführt wird. D.h. ich kann jetzt in Browser /ip-adress/datei,py auch ausführen. Dafür musste ich Apache ein wenig einstellen
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat