• 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

Hi wenn ich wie aus Beitrag #40 den Quellcode (ohne sed) verwende, erhalte ich folgende Ausgabe:

Code:
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
<head>
<title>Test</title>
</head>
<h1>Test</h1>

boa.conf
mime.types
original

MemTotal:        14244 kB
MemFree:          5900 kB
Buffers:             0 kB
Cached:            944 kB
SwapCached:          0 kB
Active:            600 kB
Inactive:          344 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:        14244 kB
LowFree:          5900 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
Mapped:              0 kB
Slab:             7048 kB
CommitLimit:      7120 kB
Committed_AS:        0 kB
PageTables:          0 kB
VmallocTotal:        0 kB
VmallocUsed:         0 kB
VmallocChunk:        0 kB

</body>
</html>

Sed ist nicht verfügbar, seit ich aber den Content-type zuerst setze, klappt die Ausgabe der Shellbefehle.Allerdings kommen die HTML-Befehle als Text und werden nicht ausgeführt. Muss ich evtl. dann einen neuen Content-type setzen?Damit er dies als HTML interpretiert??

VG und guten Rutsch!
 
Was sagt den der Browser welchen Content-Type du verschickst?
(im FF, Kontextmenü > Seiteninformation > type)

Es fehlt noch der öffnende body Tag
 
Die Busybox ist vorhanden, aber ohne SED. Folgende Befehle stehen zur Verfügung:
Code:
/bin # ls
[           deluser     gdbserver   mkdir       rm          touch
addgroup    df          grep        mkfs.jffs2  rmdir       true
adduser     dmesg       hostname    mknod       sh          tty
boa         du          inetd       more        sleep       umount
busybox     echo        init        mount       su          uptime
cat         env         kbusdemo    msh         tail        vi
chgrp       eraseall    kill        msntp       telnet      wagoset
chmod       false       killall     mv          telnetd     which
chown       free        leds        netflash    test
clear       ftp         ln          ping        tftp
cp          ftpd        login       ps          time
date        ftpget      ls          pwd         tinylogin
delgroup    ftpput      mb_tcp      reset       top

Es wird jetzt eine HTML-Seite zurück geliefert.
Hier ist die Index.html:
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test</title>
</head>
<body bgcolor="#E0E0E0">
<h1>Test</h1>
<form action="http://192.168.1.3/cgi-bin/info.sh" method="post">

<p><input type="submit" value="Daten holen"></p>
</form>
</body>
</html>

hier das Shellskript:
Code:
#!/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 " <body bgcolor="#E0E0E0">"
echo "  <h1>Test</h1>"
echo "  <form action="http://192.168.1.3/cgi-bin/info.sh" method="post">"
echo "  <p><input type="submit" value="Daten holen"></p>"
echo "  </form>"

echo
ls
echo
cd /
cd proc
cat meminfo
echo

echo " </body>"
echo "</html>"

Jetzt habe ich noch das Problem mit den Zeilenumbrüchen.

Wenn ich den content-type nur auf text setze klappt das. Es wird dann aber keine HTML-Seite zurückgegeben.
 
Zuletzt bearbeitet:
In HTML werden keine Zeilenumbrüche dargestellt. Pack das ganze in ein pre-Tag oder füge für jeden Zeilenumbruch ein br-Tag ein.
 
@hesst:

Danke für Deine Mail!

Code:
#!/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 " <body bgcolor="#E0E0E0">"
echo "  <h1>Test</h1>"

echo "  <form action="http://192.168.1.3/cgi-bin/info.sh" method="post">"
echo "  <p><input type="submit" value="Daten holen"></p>"

echo "    <table>"

cd /
cd proc

grep -H -h -e '.*: *[0-9]\+ kB' meminfo | while read LINE
do
  echo "<tr>"
  for WORD in $LINE
  do 
    if test $WORD != "kB"
    then
      echo "<td>${WORD%:*}</td>"
    fi
  done
  echo "</tr>";
done

echo "    </table>"

echo "  </form>"
echo " </body>"
echo "</html>"

Wenn ich auf der index.html den Button betätige, kommt dann zwar eine Antwortseite. Allerdings ohne das Ergebnis von meminfo. Die Seite enthält nur die Überschrift und den Button.


VG
 
Wenn ich auf der index.html den Button betätige, kommt dann zwar eine Antwortseite. Allerdings ohne das Ergebnis von meminfo. Die Seite enthält nur die Überschrift und den Button.

die -H Option beim grep ist natürlich mist, versuchs mal ohne.
und du hast noch immer den body tag doppelt.
 
Die Bedingung -H habe ich entfernt und den doppelten body-tag. Der vollständige Linux Befehl heißt "cat meminfo". Es scheint aber die if Bedingung falsch zu sein, weil durch meinen erweiterten else zweig, die Antwortseite voller "else zweig" Kommentare steht.

Code:
#!/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 bgcolor="#E0E0E0">"
echo "  <h1>Test</h1>"

echo "  <form action="http://192.168.1.3/cgi-bin/info.sh" method="post">"
echo "  <p><input type="submit" value="Daten holen"></p>"

echo "    <table>"

cd /
cd proc

grep -h -e '.*: *[0-9]\+ kB' cat meminfo | while read LINE
do
  echo "<tr>"
  for WORD in $LINE
  do 
    if test $WORD != "kB"
    then
      echo "<td>${WORD%:*}</td>"
      else
	echo "<br>else zweig<br>"
    fi
  done
  echo "</tr>";
done

echo "    </table>"

echo "  </form>"
echo " </body>"
echo "</html>"
 
Der vollständige Linux Befehl heißt "cat meminfo".
linux hat nicht nur einen Befehl. Ich meine hier die Datei meminfo.

was liefert denn
grep -h -e '.*: *[0-9]\+ kB' /proc/meminfo
poste das mal hier

EDIT: und was liefert cat meminfo? das auch mal posten!
 
Zuletzt bearbeitet:
Code:
/proc # grep -h -e '.*: *[0-9]\+ kB' meminfo      
meminfo:MemTotal:        14244 kB
meminfo:MemFree:          7024 kB
meminfo:Buffers:             0 kB
meminfo:Cached:            948 kB
meminfo:SwapCached:          0 kB
meminfo:Active:            604 kB
meminfo:Inactive:          344 kB
meminfo:HighTotal:           0 kB
meminfo:HighFree:            0 kB
meminfo:LowTotal:        14244 kB
meminfo:LowFree:          7024 kB
meminfo:SwapTotal:           0 kB
meminfo:SwapFree:            0 kB
meminfo:Dirty:               0 kB
meminfo:Writeback:           0 kB
meminfo:Mapped:              0 kB
meminfo:Slab:             5944 kB
meminfo:CommitLimit:      7120 kB
meminfo:Committed_AS:        0 kB
meminfo:PageTables:          0 kB
meminfo:VmallocTotal:        0 kB
meminfo:VmallocUsed:         0 kB
meminfo:VmallocChunk:        0 kB
/proc #

Die Ausgabe von "cat meminfo" ist in #41 zu sehen.

Das cat vor dem meminfo habe ich wieder aus dem Shellskript entfernt.
 
kann dein grep kein -h ? ruf mal grep --help auf. ist dort ein -h ? aber das ist nicht das problem.
ersetze mal
echo "<td>${WORD%:*}</td>"
durch
echo "<td>$WORD</td>"
wie sieht dann deine seite aus?
 
grep liefert:

Code:
Aufruf: grep [OPTION]... MUSTER [DATEI]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -e, --regexp=PATTERN      use PATTERN for matching
  -f, --file=FILE           obtain PATTERN from FILE
  -i, --ignore-case         ignore case distinctions
  -w, --word-regexp         force PATTERN to match only whole words
  -x, --line-regexp         force PATTERN to match only whole lines
  -z, --null-data           a data line ends in 0 byte, not newline

Verschiedenes:
  -s, --no-messages         Fehlermeldungen unterdrücken.
  -v, --revert-match        Nicht-passende Zeilen anzeigen.
  -V, --version             Versionsnummer ausgeben und beenden.
      --help                Diese Hilfe ausgeben und beenden.
      --mmap                Wenn möglich, Eingabe in den Speicher mappen.

Output control:
  -m, --max-count=NUM       stop after NUM matches
  -b, --byte-offset         print the byte offset with output lines
  -n, --line-number         print line number with output lines
      --line-buffered       flush output on every line
  -H, --with-filename       print the filename for each match
  -h, --no-filename         suppress the prefixing filename on output
      --label=LABEL         print LABEL as filename for standard input
  -o, --only-matching       show only the part of a line matching PATTERN
  -q, --quiet, --silent     suppress all normal output
      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is `binary', `text', or `without-match'
  -a, --text                equivalent to --binary-files=text
  -I                        equivalent to --binary-files=without-match
  -d, --directories=ACTION  how to handle directories;
                            ACTION is `read', `recurse', or `skip'
  -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
                            ACTION is `read' or `skip'
  -R, -r, --recursive       equivalent to --directories=recurse
      --include=FILE_PATTERN  search only files that match FILE_PATTERN
      --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN
      --exclude-from=FILE   skip files matching any file pattern from FILE
      --exclude-dir=PATTERN directories that match PATTERN will be skipped.
  -L, --files-without-match print only names of FILEs containing no match
  -l, --files-with-matches  print only names of FILEs containing matches
  -c, --count               print only a count of matching lines per FILE
  -T, --initial-tab         make tabs line up (if needed)
  -Z, --null                print 0 byte after FILE name

Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM
      --color[=WHEN],
      --colour[=WHEN]       use markers to highlight the matching strings;
                            WHEN is `always', `never', or `auto'
  -U, --binary              do not strip CR characters at EOL (MSDOS)
  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)

`egrep' means `grep -E'.  `fgrep' means `grep -F'.
Direct invocation as either `egrep' or `fgrep' is deprecated.
With no FILE, or when FILE is -, read standard input.  If less than two FILEs
are given, assume -h.  Exit status is 0 if any line was selected, 1 otherwise;
if any error occurs and -q was not given, the exit status is 2.

Report bugs to <bug-grep@gnu.org>.

Die Ausgabe sieht jetzt folgendermaßen aus (Ausschnitt) :

Code:
else zweig

else zweig

else zweig

else zweig

else zweig
meminfo:MemTotal: kB 	14244 kB
meminfo:MemFree: kB 	6328 kB
meminfo:Buffers: kB 	0 kB
meminfo:Cached: kB 	948 kB
meminfo:SwapCached: kB 	0 kB
meminfo:Active: kB 	604 kB
meminfo:Inactive: kB 	344 kB

es stehen erst so viele "else zweig" da wie es Einträge dann unterhalb für den Speicher gibt.
Das kB hab ich bei $Word dahinter ergänzt.

Kann mir das nicht erklären, sieht so aus als würde der das zweimal durchlaufen...
 
es stehen erst so viele "else zweig" da wie es Einträge dann unterhalb für den Speicher gibt.
ja, lösch das else oder schreibe
echo "<td>else zweig</td>"
in das else, das ist eine tabelle. aber wenn du das kB auch anzeigen lassen willst, kannst du auf die if-anweisung ganz verzichten.

Das kB hab ich bei $Word dahinter ergänzt.
willst du das kB anzeigen nimm einfach

Code:
grep -h -e '.*: *[0-9]\+ kB' cat meminfo | while read LINE
do
  echo "<tr>"
  for WORD in $LINE
  do 
    echo "<td>$WORD</td>"
  done
  echo "</tr>";
done
oder gleich
Code:
grep -h -e '.*: *[0-9]\+ kB' /proc/meminfo | while read LINE
do
echo "<tr><td>$LINE</tr></td>"
done

was mich aber wundert ist, daß trotz -h option beim grep der dateiname davor angezeigt wird.
diesen mußt du zusammen mit dem : noch entfernen.
 
Wenn ich statt
Code:
/proc/meminfo
,
Code:
cat meminfo
schreibe und vorher /proc einbinde, dann erfolgt die Ausgabe ohne meminfo.

Vielen Dank für Deine tolle Hilfe. Du hast mir wirklich sehr geholfen!! :D

Ich werde das jetzt noch um weitere Befehle erweitern die ich auf der Webseite darstellen will. Vielleicht kommen noch ein paar Fragen, aber prinzipiell funktioniert es jetzt.

VG
 
Wenn ich statt
Code:
/proc/meminfo
,
Code:
cat meminfo
schreibe und vorher /proc einbinde, dann erfolgt die Ausgabe ohne meminfo.

das mag ich irgendwie nicht glauben. kannst du mal den output davon posten? da müßte als erstes ein "datei cat konnte nicht gefunden werden" oder etwas in der art kommen.
kann es sein, daß du das -h beim grep vergessen hattest?
/proc ist ein directory, das bindest du nucht ein. ein cat /proc/meminfo geht auch. willst du unbedingt cat mit einbauen, dann über
Code:
cat /proc/meminfo | grep -h -e '.*: *[0-9]\+ kB'
wenn das -h bei dir nicht zieht, kannst du mal
Code:
cat /proc/meminfo | grep -h -e '.*: *[0-9]\+ kB' | while read LINE
do
  echo "<tr>"
  echo "<td>"
    echo $LINE | cut -d: -f2
  echo "</td>"
  echo "<td>"
    echo $LINE | cut -d ' ' -f3
  echo "</td>"
  echo "</tr>";
done
versuchen, brauchst allerdings cut.
 
Das ist die Ausgabe:

Code:
MemTotal: 14244 kB
MemFree: 8040 kB
Buffers: 0 kB
Cached: 948 kB
SwapCached: 0 kB
Active: 600 kB
Inactive: 348 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 14244 kB
LowFree: 8040 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB

mit diesem Shellskript:

Code:
cd /proc
  grep -h -e '.*: *[0-9]\+ kB' cat meminfo | while read LINE
  do
  echo "<tr><td>$LINE</tr></td>"
  done
  echo "</table>"

eine Fehlermeldung wegen dem cat kommt nicht..


Diese Webseite mit Statusinformationen soll eine kleine Beispielanwendung werden. Hast Du noch einen Einfall was ich noch in diese Richtung programmieren könnte?
 
Zurück
Oben