Andreas Miller: CGI-script aus cgi-scrip starten

Hallo Allerseits,

ich versuche nun schon seit laengerem aus einem cgi-script,
welches ein Passwort prueft, eine andere cgi-datei aufzurufen
und dieser auch noch einen Parameter zu uebergeben. Diese
neue Datei soll dann die Ausgabe und alles weitere uebernehmen.
Insbesondere will ich nicht die GET Methode verwenden, da dann
geheime Informationen in der Adresszeile sichtbar waeren.
Hier sind einige Beispiele, wie ich es schon versucht habe und
gescheitert bin: (im ersten Script)

#Direkter Aufruf
exec 'zweitesscript.cgi';

#ueber ssi, aber der server will die .cgi-Datei nicht parsen
print "Content-Type: text/html\n\n";
print "<HTML>\n";
print "<BODY>\n";
print "<!--#exec cgi="/cgi-bin/zweitesscript.cgi?Parameter=value"-->\n";
print "</BODY>\n";
print "</HTML>\n";

#Browser simulieren (nach einer Anregung wie es in PHP funktioniert, s.o.)
$remote =IO::Socket::INET->new( Proto     => "tcp",
                                PeerAddr  => "localhost",
                                PeerPort  => "http(80)",
                               );
        unless ($remote) { die "cannot connect to http daemon on localhost" }
        $remote->autoflush(1);
  print $remote "POST /cgi-bin/zweitesscript.cgi HTTP/1.0\n";
  print $remote "Accept: */*\n";
  print $remote "Content-type: application/x-www-form-urlencoded\n";
  print $remote "Content-lenght: 15\n\n";
  print $remote "Parameter=Value\n";
#  while ( <$remote> ) { print }; #diese Zeile rein oder raus aender nix
  close $remote;

mit telnet ist das auch nicht der hit

open(TEL, " telnet localhost 80");
print TEL "GET / HTTP/1.0\n\n"; #dies ist nur mal ein test, ob ueberhaupt was geht

Naja, soweit meine Versuche. Da ich in diesem Forum schon viele
schlaue Tricks gefunden habe, hoffe ich, dass mir irgendjemand
helfen kann. Vielen Dank schon mal im Voraus, ciao, Andreas

  1. Hi,

    ich versuche nun schon seit laengerem aus einem cgi-script,
    welches ein Passwort prueft, eine andere cgi-datei aufzurufen
    und dieser auch noch einen Parameter zu uebergeben. Diese
    neue Datei soll dann die Ausgabe und alles weitere uebernehmen.

    require, funktioniert allerdings nur einmal pro eingebundenes Script.

    #ueber ssi, aber der server will die .cgi-Datei nicht parsen

    Nein, das tut er in der Tat nicht.

    Wenn mod_perl installiert ist, kannst Du aber Apache::Include dafür verwenden.

    #Browser simulieren (nach einer Anregung wie es in PHP funktioniert, s.o.)

    use LWP::Simple wäre einfacher :-)

    HTH

    Cheatah

    1. Hallo,

      ich versuche nun schon seit laengerem aus einem cgi-script,
      welches ein Passwort prueft, eine andere cgi-datei aufzurufen
      und dieser auch noch einen Parameter zu uebergeben. Diese
      neue Datei soll dann die Ausgabe und alles weitere uebernehmen.

      require, funktioniert allerdings nur einmal pro eingebundenes Script.

      Ergänzend zum Parameterproblem habe ich gerade folgendes ausprobiert:
      $ENV{'QUERY_STRING'} = "Parameter";
      do '/usr/local/etc/httpd/htdocs/meinserver/cgi-bin/cgi.pl';

      Das funktioniert zumindest bei mir :-). Den Parameter kannst Du dann im aufgerufenen Skript ganz normal verarbeiten.

      AlexBausW

  2. Hallo Allerseits,

    ich versuche nun schon seit laengerem aus einem cgi-script,
    welches ein Passwort prueft,

    Keine Lust auf http://www.teamone.de/selfaktuell/artikel/schroepl01.htm ?

    »»  eine andere cgi-datei aufzurufen

    und dieser auch noch einen Parameter zu uebergeben.
    Diese neue Datei soll dann die Ausgabe und alles weitere uebernehmen.

    Aber dafür muß sie kein CGI-Skript sein - ein normaler Perl-Modul reicht.
    Und dann hätten Deine erste Methode funktioniert.

    #Direkter Aufruf

    »»  exec 'zweitesscript.cgi';

    Geht nicht, weil Du keine CGI-Umgebung simulierst, die Dein Skript aber braucht.
    (AlexBausW tut das in seinem Vorschlag - allerdings nur vor GET, nicht für POST.)

    #ueber ssi, aber der server will die .cgi-Datei nicht parsen

    Eben. Dein Ansatz, das selbst zu erledigen, ist schon der Richtige.

    #Browser simulieren (nach einer Anregung wie es in PHP funktioniert, s.o.)

    Das wäre der richtige Weg, falls das zweite Skript unbedingt CGI sein muß. (Allerdings mit LWP::Simple, wie bereits von Cheatah vorgeschlagen.)
    Dies ist jedoch nur dann der Fall, wenn Du den Quelltext des zweiten Skripts nicht hast; andernfalls kannst Du dieses Skript, wenn es denn selbst auch direkt aufgerufen werden muß, in ein Kern-Skript und eine CGI-Schale aufteilen.

    1. Hallo nochmal,

      Geht nicht, weil Du keine CGI-Umgebung simulierst, die Dein Skript aber braucht.
      (AlexBausW tut das in seinem Vorschlag - allerdings nur vor GET, nicht für POST.)

      In dem vorliegenden Fall vermutete ich, daß die Parameter nicht in der
      Url auftauchen sollen. Wenn ich $ENV{'QUERY_STRING'} in einem Skript ändere,
      bleibt das doch für den User (und alle Anderen? ) unsichtbar! Ich benötige also nicht unbedingt "Post",
      um Parameter zu übergeben !?!. Wenn dem nicht so ist, bitte ich um eine Korrektur (vor allem weil ich
      vorhabe, das so ähnlich zu verwenden :-) !

      AlexBausW

      1. Geht nicht, weil Du keine CGI-Umgebung simulierst, die Dein Skript aber braucht.
        (AlexBausW tut das in seinem Vorschlag - allerdings nur vor GET, nicht für POST.)
        In dem vorliegenden Fall vermutete ich, daß die Parameter nicht in der
        Url auftauchen sollen. Wenn ich $ENV{'QUERY_STRING'} in einem Skript ändere,
        bleibt das doch für den User (und alle Anderen? ) unsichtbar! Ich benötige also nicht unbedingt "Post",
        um Parameter zu übergeben !?!.

        Das meinte ich nicht.
        Ich meinte: Wenn man GET verwendet, dann kann man die Umgebung über QUERY_STRING bauen. Bei POST braucht man eine Eingabe über stdin, wenn ich mich jetzt spontan richtig erinnere - das geht natürlich auch.