Björn Sippel: Unterdrückung cmd-Fenster (Windows-Perl) bei Aufruf von externem Program

Hallo zusammen,

habe folgendes Anliegen:

Mittels lokalen Webserver (Apache) sollen Registry-Daten
tabellarisch angelistet werden.
Gesammelt wird mittels reg.exe (W2K).
Das Perlscript funktioniert an der Konsole ohne Probleme.
Beim Aufruf über den Webserver(Browser) poppt jedoch
ganz kurz das (schwarze) CMD-Fenster auf.

Da im spateren Verlauf die Registry rekursiv durchlaufen wird,
ergibt das beim Aufruf über den Webserver (Browser) einen
regelrechten Wald von aufblinkenden Consolen-Fenster.

-- Wie kann die Anzeige des CMD-Fensters unterbunden werden ???
-- Dieses Registry-Beispiel soll exemplarisch sein.
   Naturlich konnen  Registrydaten auch mit den entsprechenden
    Modulen gelesen werden :-).

Meine bisherigen Versuche:
Verwendung von

  • Backticks
  • WIN32::Console

hatten keinen Erfolg.

Code:
--Ersetzung-
Da groesser und kleinerzeichen umgewandelt werden,
habe ich diese ersetzt.
Um den Code wieder "lesbar" zu machen,
muss mit folgendem Muster ersetzt werden:
#z# <
#u# >
#s# '

Code:
-------
#!C:\perl\bin\perl.exe

use CGI;
#use strict;
use FileHandle;
use WIN32::Console;

my @zprog;
my $zzpci;

print "Content-type: text/html\n\n";
print  #s##z#html#u##s#;
print  #s##z#head#u##s#;
print  #s##z#meta name="author" content="XXX#u##s#;
print  #s##z#/head#u##s#;
print  "#z#body#u#&nbsp;#z#p#u##z#h1#u#GCI with Windows Registry#z#/h1#u#";

my $keypci="HKLM\SYSTEM\ControlSet001\Enum\PCI";

@zprog = reg query $keypci \|findstr HKEY;

print  "#z#table border=1 cellpadding=5 style="line: solid blue"#u#";

--------------------------------------------------------

foreach $zzpci(@zprog){
print "#z#tr#u#";
print "#z#td#u#$zzpci#z#/td#u#\n";
print "#z#/tr#u#";
}

--------------------------------------------------------

print "#z#/table#u#";
print  "#z#/body#u##z#/html#u#";

  1. hallo,

    Beim Aufruf über den Webserver(Browser) poppt jedoch
    ganz kurz das (schwarze) CMD-Fenster auf.

    Das ist beim Aufruf eines Perl-Scripts über die Konsole sehr "normal", beim Aufruf als CGI-Script jedoch mehr als ungewöhnlich, und ich habe das auch nicht nachvollziehen können, als ich dein angegebenes Script mal 1:1 in ein CGI-Script verwandelt und auf meinem lokalen System (WinXP, Apache 2.0.52) aufgerufen habe. Sehr ungewöhnlich und wahrschenlich nicht beabsichtigt ist jedoch, was ich bei einem CGI-Aufruf deines Scripts im Browser zu sehen bekomme:
    #z#body#u# #z#p#u##z#h1#u#GCI with Windows Registry#z#/h1#u#1111#z#table border=1 cellpadding=5 style="line: solid blue"#u##z#tr#u##z#td#u#HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI #z#/td#u# #z#/tr#u##z#tr#u##z#td#u#HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\d344prt #z#/td#u# #z#/tr#u##z#tr#u##z#td#u#HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_105A&DEV_4D68&SUBSYS_4D68105A&REV_01 #z#/td#u# #z#/tr#u##z#tr#u##z#td#u#HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_109E&DEV_036E&SUBSYS_13EB0070&REV_11 #z#/td#u#

    Da solltest du eventuell doch den Sinn deiner ganzen #-Zeichen nochmal prüfen. Fehlermeldungen im log gibts übrigens keine.

    Da im spateren Verlauf die Registry rekursiv durchlaufen wird,
    ergibt das beim Aufruf über den Webserver (Browser) einen
    regelrechten Wald von aufblinkenden Consolen-Fenster.

    Das ist auch mit deinem angegebenen Script nicht nachvollziehbar.

    -- Wie kann die Anzeige des CMD-Fensters unterbunden werden ?

    Indem das Script tatsächlich den Kriterien entspricht, die ein CGI-Script nun einmal erfüllen sollte.

    -- Dieses Registry-Beispiel soll exemplarisch sein.

    Wofür?

    Da groesser und kleinerzeichen umgewandelt werden, habe ich diese ersetzt. Um den Code wieder "lesbar" zu machen, muss mit folgendem Muster ersetzt werden:
    #z# <
    #u# >
    #s# '

    Ähhhh ... ist das nicht eher etwas, wofür man sonst RegExpressions einsetzt? Würde ich jedenfalls machen. Abgesehen davon, daß ich es für extremen Leichtsinn halte, per Script jedem Besucher Einblick in die registry zu gewähren. Unter Win2k dann auch noch mit root-Rechten.

    Grüße aus Berlin

    Christoph S.

    1. Hi Christoph

      #z# <
      #u# >
      #s# '

      Ähhhh ... ist das nicht eher etwas, wofür man sonst RegExpressions einsetzt?

      tut er ja, statt / kann mann auch # schreiben, um sich in den Ausdrücken das escapen der / zu sparen.

      Allerdings sehe ich hier auf anhieb keine / die escaped werden müßten!?

      Tschau
      rolf

      1. Hi again

        tut er ja, statt / kann mann auch # schreiben, um sich in den Ausdrücken das escapen der / zu sparen.

        hab mir den code jetzt erst mit gruseln angeschaut und nehme alles wieder zurück. Sorry.

        tschau
        rolf

      2. hallo,

        Ähhhh ... ist das nicht eher etwas, wofür man sonst RegExpressions einsetzt?
        tut er ja

        Nö. Ich kann jedenfalls nichts davon erkennen.

        Allerdings sehe ich hier auf anhieb keine / die escaped werden müßten!?

        Das Script tut in folgender Form wohl das, was es tun soll (allerdings fehlt mir jedes Verständnis dafür, warum man das im Browser lesen können muß):

        use CGI;
        use strict;
        use FileHandle;
        use WIN32::Console;

        my @zprog;
        my $zzpci;

        print "Content-type: text/html\n\n";
        print "<html><head><meta name="author" content="XXX"></head>";
        print "<body><h1>CGI with Windows Registry</h1>";

        my $keypci="HKLM\SYSTEM\ControlSet001\Enum\PCI";

        @zprog = reg query $keypci \|findstr HKEY;

        print  "<table border=1 cellpadding=5 style="line: solid blue">";
        foreach $zzpci(@zprog){
        print "<tr>";
        print "<td>$zzpci></td>\n";
        print "</tr>";
        }
        print "</table>";
        print  "</body></html>";

        Grüße aus Berlin

        Christoph S.

        1. Hi Christoph,

          Ähhhh ... ist das nicht eher etwas, wofür man sonst RegExpressions einsetzt?
          tut er ja

          Nö. Ich kann jedenfalls nichts davon erkennen.

          die Sache mit den # ist so abstrus dass mein Kleinhirn den Code in die Schublade RegExp Störrauschen geschoben hat ;)

          Keine Ahnung warum er das macht, dein Code sollte ja auch funktionieren und dass ganz ohne RegExp.

          Ein Aufpoppen irgendwelcher Fenster kann ich mir vorstellen wenn er aus dem Browser heraus _direkt_ das .pl startet, statt über den lokalen Webserver zu gehen.

          Tschau
          rolf

          1. Hallo Rolf,

            die Sache mit den # ist so abstrus dass mein Kleinhirn den Code in die Schublade RegExp Störrauschen geschoben hat ;)

            ich habe oben kurz den Hintergrund fur die Expression angefuhrt,
            da das paste and copy bei mir nicht so wollte, wie es sollte...
            Also nur Hilfsmittel fur die Darstellung.

            Keine Ahnung warum er das macht, dein Code sollte ja auch funktionieren und dass ganz ohne RegExp.

            Ein Aufpoppen irgendwelcher Fenster kann ich mir vorstellen wenn er aus dem Browser heraus _direkt_ das .pl startet, statt über den lokalen Webserver zu gehen.

            -- Nochmal zum Zweck dieses Codes:
              Es soll per Link ein Perlscript gestartet werden, welches auch
              Aufrufe von beliebigen Fremdprogammen beinhaltet.
              An der Konsole funktioniert auch alles prima, bis auf das
              schwarze Commandfenster.

            1. Hallo Björn

              klär uns nochmal auf:

              Christoph geht davon aus dass du deine Anfrage über einen Webserver laufen läßt der lokal läuft, also ein normales CGI.

              Ich geh davon aus dass du direkt eine perldatei in deinem Dateisystem adressierst, also file://..../xyz.pl
              aufrufst. Das ist aber kein CGI.

              Das sind 2 paar Schuhe...

              Tschau
                Rolf

              1. Hallo Rolf,

                klär uns nochmal auf:

                -- kommt sofort :-;

                Christoph geht davon aus dass du deine Anfrage über einen Webserver laufen läßt der lokal läuft, also ein normales CGI.

                -- habe (w)xampp installiert, und das perl-script liegt im
                cgi-bin Verzeichnis.

                Ich geh davon aus dass du direkt eine perldatei in deinem Dateisystem adressierst, also file://..../xyz.pl
                aufrufst. Das ist aber kein CGI.

                -- das script wird uber einen link aufgerufen.

                -- http://localhost/cgi-bin/registry.pl

                Vermutlich benotige ich wohl ein bischen Aufklarung in puncto
                CGI und Webserver-Schnittstelle !?!

                Also, was mochte ich erreichen:

                • konkret ist es ein Mini-Nachbau analog
                  zum SAP ABAP Debugger, hier mit HTML-Oberflache,
                  um interne (SAP Sprachgebrauch) Tabellen anzeigen zu lassen.

                • Die Struktur meines Codings entspricht quasi einem
                  Inhaltsverzeichnis. Eine verkurzte Form dieser Struktur
                  wird in einem DHTML/JS TREE abgebildet und soll es mir ermoglichen,

                jeweils die gewunschten internen  Tabellen, in Perl-"Deutsch"
                Array's / Hashes anzuzeigen.

                • Man kann naturlich auch den Komodo Debugger verwenden :-)
                  Aber in diesem recht guten IDE ist es manchmal "unubersichtlich",
                  es sei denn, man hat einen 19" Bildschirm.

                -- Meine Idee war jetzt einfach, das Perl-Script uber den
                lokalen Webserver aufzurufen, da ich NICHT immer das Program
                von der Konsole aus starten wollte.

                ALSO:
                Im linken Frame Program uber Link starten, im rechten Frame das
                Ergebnis anlisten lassen .

                -- Kurze Anmerkung bzgl. "gruseliger" Code:
                Ich habe mir nachtraglich nochmal die Bedienungsanleitung
                des Forums durchgelesen und habe dann verstanden, weshalb
                mein Coding beim Einfugen verstummelt wurde.

                Die Ersetzungen dienten dem "Umschiffen" dieser automatischen
                Ersetzung, nicht etwa, um "kunstvollen" Code zu erzeugen.
                --Loschung von grosser und kleiner Tags.

                Sinn der angelisteten Datenschlussel
                Die angelisteten Registry-Schlussel enthalt Eure
                (ungefilterte) aktuelle lokale PCI-/AGP Hardware. Wenn jetzt noch
                die Registry-Informationen "ein bischen" aufbereitet
                werden, kommt eine "hubsche" Tabelle analog dem
                Geratemanager heraus.

                In meinen Antworten zu jedem Eurer Postings weiter oben
                habe ich das versucht zu beschreiben.

                best regards, Bjoern

                1. Hi

                  -- habe (w)xampp installiert, und das perl-script liegt im
                  cgi-bin Verzeichnis.

                  So? Hmm keine erfahrung, sorry.

                  den einzigen assoziation die ich zu diesem Problem noch hätte wäre dass den xampp vielleicht nicht als dienst im hintergrund läuft sondern händisch gestartet wurde...

                  Ansonsten vielleicht im Supportforum reinschauen.

                  Tschau
                  rolf

                  1. Hi,

                    So? Hmm keine erfahrung, sorry.

                    --!?!, allerdings bezieht sich meine Erfahrung auf die
                    Einrichtung des Webservers der Uni
                    Stuttgart Hohenheim incl. CGI-Schnittstelle mit
                    einer pseudo-Datenbankschnittstelle auf die Jahre 1993-1994.. :-;

                    Damals startete ubrigens SELFHTML und war damals in Windeseile
                    uberall verbreitet. Habe jedoch den Schwerpunkt wieder auf mein
                    damaliges Studium verlegt, anstatt irgendwelchen vergessenen
                    Leerzeichen, Pfadangaben und sonstigen (Perl) Quereleien
                    nachzuforschen, mit denen man Tage verbringen konnte.

                    Und als Browser war damals der NCSA Mosaic 3.0 der absolute
                    Hit, und Tabellen Tags gerade die neueste Errungenschaft ...

                    den einzigen assoziation die ich zu diesem Problem noch hätte wäre dass den xampp vielleicht nicht als dienst im hintergrund läuft sondern händisch gestartet wurde...

                    --Vielen Dank fur den Tipp. Habe den Xampp jetzt als Services
                    gestartet, und siehe da, es funktioniert !!!!

                    Vielen Dank nochmals.

                    Eine letzte Frage noch:

                    Im Script werden Gifs angezogen, welche ich ursprunglich in einem
                    Unterverzeichnis des CGI-BIN Verzeichnisses abgelegt hatte.
                    Hatte jedoch den Effekt, das die Bilder "ausgefuhrt" wurden,
                    sprich, es wurde die damit verknupfte Anwendung gestartet, und
                    die Gifs wurden nicht angezeigt. Auch das manuelle Laden von
                    HTML-Dateien aus dem CGI-BIN Verzeichnis fuhrt zu diesem
                    Effekt

                    Nachdem ich die Icons in den htdoc-Pfad verschoben habe und die
                    Gifs uber URL aufrufe, klappt das. Ist das prinzipiell jetzt nicht moglich,
                    Grafiken im cgi-bin Verzeichnis anzuziehen, ohne dass diese
                    "ausgefuhrt" werden ?

        2. Hallo Christoph,

          (allerdings fehlt mir jedes Verständnis dafür, warum man das im Browser lesen können muß):

          -- Ziel 1 ist die Darstellung der aktiven PCI/AGP Hardware
             im Browser. und zwar den Daten entsprechend im
             Geratemanager.

          -- Ziel 2 ist die Darstellung dieser (internen) Tabelle, um
             einen bequemen quasi-Debugger zu besitzen.
             Im SAP-ABAP kann man das z.B. sehr schon machen,
            und baue mir hier kurz ein kleines Aquivalent .

          -- Ziel 3 war und ist noch die Ermittlung der Seriennummern der
             Festplatten !!, nicht der Volumes !!!

          -- Ziel4 ist der Eigenbau eines "einfachen"
            Dateiverwaltungsystem uber beliebig viele Festplatten und
             beliebige Systeme

    2. Hallo Christoph,

      kurze Aufklärung für die aufgetretenen Unklarheiten:
      Die Strings #z# ,#u#, #s# habe ich nur deshalb gesetzt,
      da nach dem copy and paste hier in dieses Forumseingabefenter
      diese "sonderzeichen" HTML-Konform umgewandelt wurden.
      Allerdings wurden in der erneuten Vorschau diese HTML-konforme
      Knvertierung nicht ieder korrekt aufgelost, also
      &....; blieb auch &....;.

      Um das Ausprobieren des Codes zu erleichtern , habe ich diese
      Expressions eingesetzt.

      Indem das Script tatsächlich den Kriterien entspricht, die ein CGI-Script nun einmal erfüllen sollte.

      -- welche sind das ? Muss hier der Aufruf anderst erfolgen ?
      -- Der Aufruf erfolgt uber den Browser

      -- Dieses Registry-Beispiel soll exemplarisch sein.

      Wofür?

      -- Generell eigene Programme uber den Browser per Link
         anzustarten und sich das Ergebnis per HTML anzuschauen

  2. Mittels lokalen Webserver (Apache) sollen Registry-Daten
    tabellarisch angelistet werden.
    Gesammelt wird mittels reg.exe (W2K).
    Das Perlscript funktioniert an der Konsole ohne Probleme.
    Beim Aufruf über den Webserver(Browser) poppt jedoch
    ganz kurz das (schwarze) CMD-Fenster auf.

    Deine Frage läßt sich nicht so einfach beantworten.

    Code:

    #!C:\perl\bin\perl.exe

    Ist das notwendig?
    Hier kommt es darauf an wie dein Server Konfiguriert ist, der Apache läßt sich mittlerweile so einstellen, dass diese Zeile nicht notwendig ist.

    use WIN32::Console;

    Wozu brauchst du das? Kann das evtl. die Ursache für das DOS Fenster sein?

    @zprog = reg query $keypci \|findstr HKEY;

    Ich benutze für system Aufrufe immer system '....' bei mir (WinXP) geht dann zumindest kein DOS Fenster auf.

    Struppi.