cr: shell_exec

hallo!

ich würde gerne eine .bat datei mittels php aufrufen.

wenn ich die .bat datei in der eingabeaufforderung mit "test.bat testen"
aufrufe, klappts prima.

wenn ich nun in php shell_exec('..\test.bat testen'); aufrufen klappt das auch prima...aber:

wenn ich nun das "testen" durch eine php variable ersetze, also  shell_exec('..\test.bat $post_inhalt'); aufrufe klappt es nicht mehr...

den inhalt der  variable übergebe ich mittels post, lese ihn dann aus und prüfen ob ein wert vorhanden ist. zusätzlich lasse ich mir auch die variable ausgeben. der inhalt stimmt überein, aber die batch datei nimmt den befehl nicht an.

was kann ich tun?

danke füür eure hilfe!

  1. Hi!

    wenn ich nun das "testen" durch eine php variable ersetze, also  shell_exec('..\test.bat $post_inhalt'); aufrufe klappt es nicht mehr...

    Was erzeugt eine Kontrollausgabe von '..\test.bat $post_inhalt'? Was ist der Unterschied zwischen "" und '' bei Strings unter PHP? Und was unternimmst du, damit nicht beliebige Anweisungen angehängt werden können? (Wobei schon Dateinamen mit Leerzeichen drin Probleme bereiten.)

    den inhalt der  variable übergebe ich mittels post, lese ihn dann aus

    Wenn du damit das unnötige Umkopieren in eine andere Variable meinst, warum tust du das?

    zusätzlich lasse ich mir auch die variable ausgeben.

    Sehr gut, aber ...

    [...] aber die batch datei nimmt den befehl nicht an.

    ... eine Kontrollausgabe innerhalb der Batchdatei hast du vermutlich nicht gemacht.

    Lo!

    1. Was erzeugt eine Kontrollausgabe von '..\test.bat $post_inhalt'? Was ist der Unterschied zwischen "" und '' bei Strings unter PHP? Und was unternimmst du, damit nicht beliebige Anweisungen angehängt werden können? (Wobei schon Dateinamen mit Leerzeichen drin Probleme bereiten.)

      wenn ich das nur wüsste?

      Wenn du damit das unnötige Umkopieren in eine andere Variable meinst, warum tust du das?

      weil die variable ein sich ändernder wert ist und ich diesem somit nicht statisch in die php anweisung schreiben kann.

      ... eine Kontrollausgabe innerhalb der Batchdatei hast du vermutlich nicht gemacht.

      das überfordert meine fähigkeiten...leider...

      1. Hi!

        Was erzeugt eine Kontrollausgabe von '..\test.bat $post_inhalt'? Was ist der Unterschied zwischen "" und '' bei Strings unter PHP? Und was unternimmst du, damit nicht beliebige Anweisungen angehängt werden können? (Wobei schon Dateinamen mit Leerzeichen drin Probleme bereiten.)
        wenn ich das nur wüsste?

        Wenn du auf die ersten beiden Fragen keine Antwort finden kannst, dann musst du noch viel lernen. Die Antwort auf die erste Frage bekommst du mit var_dump() oder auch mit echo. Die Antwort auf die zweite Frage ist PHP-Grundwissen, das bekommt man in jedem Tutorial so ziemlich am Anfang erklärt. Sie sollte dir eigentlich auf die Sprünge helfen, das es einen Unterschied zwischen "" und '' gibt, was die Variablenauswertung angeht.

        Die dritte Frage ist leider selten Tutorialgegenstand (in ihrer allgemeinen Form). Du must dafür Sorge tragen, dass entweder nur (handverlesene) gewünschte Werte eingefügt werden können - was bei der Übergabe durch einen Client erst einmal nicht der Fall ist - oder dass du dafür sorgst, dass alle Sonderzeichen kontextgerecht notiert werden.

        Wenn du damit das unnötige Umkopieren in eine andere Variable meinst, warum tust du das?
        weil die variable ein sich ändernder wert ist und ich diesem somit nicht statisch in die php anweisung schreiben kann.

        Das war nicht die Frage. Ich fragte, ob du sowas (unnötiges) wie dies machst:

        ~~~php $var = $_POST['var'];

        Da du den Wert sowieso nicht direkt in die shell\_exec()-Anweisung übernehmen darfst (wenn dir die Sicherheit deines Servers lieb ist), erübrigt sich auch das Problem der nicht aufgelösten Variablen.  
          
          `shell_exec(sprintf('command "%s"', str_replace('"', '""', $argument));`{:.language-php}  
          
        Die "" um den Platzhalter %s sorgen dafür, dass der eingefügte Wert in "" stehend übergeben wird. Das ist notwendig, wenn du Leerzeichen im Dateinamen oder Pfad hast. Die Ersetzung von einem " im Argument durch zwei "" ist nötig, damit dir keiner aus dem String ausbrechen kann und anschließend ungewünschte Kommandos anhängen kann.  
          
        
        > > ... eine Kontrollausgabe innerhalb der Batchdatei hast du vermutlich nicht gemacht.  
        > das überfordert meine fähigkeiten...leider...  
          
        Innerhalb der Batchdatei greifst du doch auf den übergebenen Wert zu. Dazu verwendest du einen Platzhalter, eine Variabe, was auch immer.  
        Es sollte nicht so schwer sein, diesen Platzhalter/Variable/wasimmer mit einem Ausgabekommando anzeigen zu lassen, mit echo beispielsweise.  
          
          
        Lo!
        
  2. Moin Moin!

    wenn ich nun das "testen" durch eine php variable ersetze, also  shell_exec('..\test.bat $post_inhalt'); aufrufe klappt es nicht mehr...

    Was passiert, was erwartest Du stattdessen?

    Bist Du sicher, dass PHP in Single Quotes interpoliert?

    Bist Du sicher, dass Du shell_exec mit beliebigen, ungeprüften Werten wie z.B. ";format c: /u" aufrufen willst?

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Moin Moin!

      moin

      Was passiert, was erwartest Du stattdessen?

      es passiert nichts...und es sollte eigentlich über die batch ein truecryptlaufwerk einbinden

      Bist Du sicher, dass PHP in Single Quotes interpoliert?

      nein...

      Bist Du sicher, dass Du shell_exec mit beliebigen, ungeprüften Werten wie z.B. ";format c: /u" aufrufen willst?

      ja...da dies ja nur passwörter sind und wenn es falsch ist passiert nix :)

      die batch greift nur auf truecrypt zu, versucht ein laufwerk einzubinden und benötigt dafür das passwort. das klaappt wie gesagt wenn ich es im klartext in die .php schreibe, über die variable nicht...und ich (als laie) verstehe nichtr warum... :(

    2. Hi!

      Bist Du sicher, dass Du shell_exec mit beliebigen, ungeprüften Werten wie z.B. ";format c: /u" aufrufen willst?

      Klappt so nicht, das ; ist kein Befehlstrenner unter DOS/Windows. Inwieweit ein Zeilenumbruch was anstellt, kann ich nicht untersuchen. Es reichen aber sicher schon die üblichen Pipe-Geschichten mit | < > und Konsorten.

      Lo!

  3. Fehler gefunden:

    wenn ich nun das "testen" durch eine php variable ersetze, also  shell_exec('..\test.bat $post_inhalt'); aufrufe klappt es nicht mehr...

    ich habe shell_exec("...") in doppelte anführeungszeichen gesetzt. dann habe ich bemerkt, dass es von test.bat das t nicht übermittelt aufgrund des . also kurzerhand alles in ein verzeichnis gelegt und schon klappts :))

    danke trotzdem!