Andres Freund: Kann man STDIN Werte übergeben?

Hallo

ALso, ich habe das folgende Problem: Ich führe mit eval() ein anderes Script aus und will diesem bestimmte parameter übergeben. Mit den get Werten ist mir dies über
$ENV{"QUERY_STRING"} = "parameter = parameterinhalt";
auch gelungen, aber hat einer von euch eine Idee wie ich dies mit STDIN machenkann? Kann sein das ich gerade etwas auf dem Schlauch liege.

Vielen Dank

Andres Freund

Ps: Mein Kopf (bessergesagt mein Gehirn) raucht langsam ;-)

  1. Hallo, hier bin ich nochmal,
    Falls niemand wissen sollte wie das alles geht, hättet ihr eine wie man dem script (auf das ich keinen Einfluß habe) in dem eval Block die Post inhalte zukommen lassen könnte?

    rätselnde Grüße
    Andres

    1. Hallo, hier bin ich nochmal,

      dito  <!-- Begrüssung ;)

      Falls niemand wissen sollte wie das alles geht, hättet ihr eine wie man dem script (auf das ich keinen Einfluß habe) in dem eval Block die Post inhalte zukommen lassen könnte?

      Öm. Wie wäre es, wenn du die GET-Methode simulierst???

      {
         local $ENV{QUERY_STRING};
         $ENV{QUERY_STRING} = 'what ever you want to give the script...';
         eval {...}
      }

      dem QueryString kannst du natürlich dann auch die POST Daten übermitteln... Zumindest mit CGI.pm funktioniert das, meinen unbestätigten Gedanken zur Folge, gut.

      Viele Grüsse

      Philipp

      1. Hallo, hier bin ich nochmal,

        dito  <!-- Begrüssung ;)

        Falls niemand wissen sollte wie das alles geht, hättet ihr eine wie man dem script (auf das ich keinen Einfluß habe) in dem eval Block die Post inhalte zukommen lassen könnte?

        Das Problem ist, das icgh auf das im eval Block ausgeführte wie gesagt keinen Einfluß habe und die dort benutzten Methoden die Parameter zu bekommen eventuell nicht so intelligent sin wie CGI.pm.
        Notfalls werde ich es aber so machen müssen.
        Danke!

        Andres Freund

        Philipp

        1. Halihallo Andres

          Falls niemand wissen sollte wie das alles geht, hättet ihr eine wie man dem script (auf das ich keinen Einfluß habe) in dem eval Block die Post inhalte zukommen lassen könnte?

          Das Problem ist, das icgh auf das im eval Block ausgeführte wie gesagt keinen Einfluß habe und die dort benutzten Methoden die Parameter zu bekommen eventuell nicht so intelligent sin wie CGI.pm.
          Notfalls werde ich es aber so machen müssen.

          Du solltest etwas weniger reden, dafür etwas mehr zuhören. Dann würdest du erkennen, dass ich dir eine Lösung aufgezeigt habe ;)
          Man braucht nicht die Intelligenz von CGI.pm um meinen Lösungsvorschlag benutzen zu können ;)

          Sorry für die arroganten und überheblichen Sprüche, ich musste grad mal etwas Dampf ablassen.

          Aber nun: Wie ist denn der Code in eval beschaffen? - Ich meine, woher kriegst du den Code, der dort drinne ausgeführt wird? - Ist das reiner ASCII-Text, der dort in eval eingebunden wird (eg. durch externe Datei), oder startest du dort ein Programm wiederum über einen HTTP-Request?

          Und: Hast du meine Tipps überhaupt schon ausprobiert?

          Viele Grüsse

          Philipp
             <-- der sich für das arrogante Posting schon jetzt entschuldigt, es jedoch nicht gleich unterlassen wollte, da er damit etwas Balast abwerfen kann, zu Lasten von Andres, der gar nix damit zu tun hat.

  2. Halihallo

    ALso, ich habe das folgende Problem: Ich führe mit eval() ein anderes Script aus und will diesem bestimmte parameter übergeben. Mit den get Werten ist mir dies über
    $ENV{"QUERY_STRING"} = "parameter = parameterinhalt";
    auch gelungen, aber hat einer von euch eine Idee wie ich dies mit STDIN machenkann? Kann sein das ich gerade etwas auf dem Schlauch liege.

    ist zwar eine Vergewaltigung von allem, was mir lieb ist, aber... :-)

    {
       local *STDIN;
       open( STDIN, '<./input_data.txt' );
       eval {...}
    }

    Viele Grüsse

    Philipp

  3. Hi,

    Ich führe mit eval() ein anderes Script aus

    warum? Was fehlt Dir bei "system()" oder backquotes, die beide dafür
    gedacht sind, andere Programme auszuführen?

    und will diesem bestimmte parameter übergeben.

    Wenn Du mit Parametern das meinst, was man als Kommandozeilenparameter
    normalerweise so verwendet, dann verwende Kommandozeilenparameter.
    (Was natürlich voraussetzt, daß das aufgerufene Programm Kommandozeilen-
    parameter erwartet und nichts anderes. Tut es das? Wie sind seine
    Aufrufbedingungen?)

    Mit den get Werten ist mir dies über
    $ENV{"QUERY_STRING"} = "parameter = parameterinhalt";
    auch gelungen, aber hat einer von euch eine Idee wie ich dies mit
    STDIN machenkann? Kann sein das ich gerade etwas auf dem Schlauch liege.

    Das klingt für mich alles so, als würdest Du mit Gewalt Interprozeß-
    kommunikation via HTTP simulieren wollen. Das ist aber nicht der Sinn
    von HTTP.

    Wenn Du ein weiteres Programm starten und diesem Programm Daten via
    stdin übergeben willst, dann schreibe die Daten nach stdout und ver-
    binde beide Programme über eine Pipe - damit wird das stdout des ersten
    Programms zum stdin des zweiten.

    Sollte dies Dein Szenario nicht korrekt beschreiben, dann fehlen
    wesentliche Teile Deiner Aufgabenstellung in Deinem Posting.

    Viele Grüße
          Michael

    1. Hi,

      Das klingt für mich alles so, als würdest Du mit Gewalt Interprozeß-
      kommunikation via HTTP simulieren wollen. Das ist aber nicht der Sinn
      von HTTP.

      Es geht um Perl über CGI, Sorry das ich Vergessen habe das zu erwähnen. Ich will in einem Scipt ein anderes einbinden, und diesem die Parameter (damit meine ich die mit Get und Post übergebenen Daten) übergeben die es bei direktem aufruf auch bekommen würde. Da ich auf die Scripts keinen Einfluss habe, muss ich die normale Http umgebung simulieren, oder hättest du (oder jemand anderes) da eine andere Idee?

      Wenn Du ein weiteres Programm starten und diesem Programm Daten via
      stdin übergeben willst, dann schreibe die Daten nach stdout und ver-
      binde beide Programme über eine Pipe - damit wird das stdout des ersten
      Programms zum stdin des zweiten.

      Wie geht das? Ich habe gedacht Pipes wären nur unter Linux verfügbar und (wie ich leider ebenfalls vergessen habe zu erwähnen) sollte dieses Script unter Win und Unix,Linux o.ä. laufen.

      Sollte dies Dein Szenario nicht korrekt beschreiben, dann fehlen
      wesentliche Teile Deiner Aufgabenstellung in Deinem Posting.

      siehe oben.

      Noch eine Frage: Kann man (oder Frau um korrekt zu sein ;-)) ein Filehandle (wie es STDOUT ja eigentlich ist) irgendwie in eine Variable umleiten? Ich müsste nähmlich den (mit print erzeugten)Output abfangen um ihn dann evtl. noch zu verändern.
      Gerade ist mir eingefallen, das es evtl so gehen köntte, dass man STDOUT vom direktem Output lokal entbindet und dann mit READ liest (muss ich mal ausprobieren.

      Viele Grüße und Vielen

      1. Hi,

        Das klingt für mich alles so, als würdest Du mit Gewalt Interprozeß-
        kommunikation via HTTP simulieren wollen. Das ist aber nicht der Sinn
        von HTTP.
        Es geht um Perl über CGI, Sorry das ich Vergessen
        habe das zu erwähnen.
        Ich will in einem Scipt ein anderes einbinden,

        was heißt nun schon wieder "einbinden"?

        Gerade hatte ich geglaubt, verstanden zu haben, daß Du
        von Skript A einen HTTP-Request an Skript B starten
        willst und diesem dann Parameter mitgeben möchtest,
        welche B über _seine_ CGI-Schnittstelle lesen kann.

        und diesem die Parameter (damit meine ich die mit
        Get und Post übergebenen Daten) übergeben die es
        bei direktem aufruf auch bekommen würde.

        Also doch. Ersetzen "Aufruf" durch "HTTP-Request".
        Mit "eval" bist Du bei dieser Aufgabe im völlig
        falschen Film.

        Da ich auf die Scripts keinen Einfluss habe, muss
        ich die normale Http umgebung simulieren,

        Dazu hast Du aber nicht die geringste Chance - nicht
        mal, wenn Du einen kompletten Webserver nachprogram-
        mierst (weil Du zudem auch noch die komplette Web-
        server-Konfiguration für B kennen müßtest).

        oder hättest du (oder jemand anderes) da eine
        andere Idee?

        Sende einen HTTP-Request von A nach B. Dafür gibt
        es in Perl fertige Module.

        Für GET würde LWP::Simple reichen; für POST muß
        es etwas mehr sein, beispielsweise LWP::UserAgent.
        Beides ist im "lwpcook" beschrieben.

        Wie geht das? Ich habe gedacht Pipes wären nur
        unter Linux verfügbar und (wie ich leider ebenfalls
        vergessen habe zu erwähnen) sollte dieses Script
        unter Win und Unix,Linux o.ä. laufen.

        Aha - Deine Aufgabenstellung beginnt langsam, Formen
        anzunehmen. ;-)

        Noch eine Frage: Kann man (oder Frau um korrekt zu
        sein ;-)) ein Filehandle (wie es STDOUT ja
        eigentlich ist) irgendwie in eine Variable umleiten?

        Alles, was Du aus einem filehandle liest, kannst Du
        einer Variable zuweisen ... war das Deine Frage?

        Ich müsste nähmlich den (mit print erzeugten)Output
        abfangen um ihn dann evtl. noch zu verändern.

        Das verstehe ich nicht.

        Wieso hältst Du nicht einfach Deine Ausgabe zurück,
        bis Du weißt, was Du ausgeben willst?

        (Liest mal "sprintf", das dürfte Dir weiter helfen.)

        Viele Grüße
              Michael