PHP Variable zuweisen

  • Hallo,

    wie kann ich den String

    /usr/bin/gs -sDEVICE=pdfwrite -o code_1".$index.".pdf -dFIXEDMEDIA -c "<</BeginPage{0.7 0.7 scale}>> setpagedevice" -f ./inp".$index.".pdf

    in PHP einer Variablen zuweisen (damit er dann mit exec ausgeführt werden kann)?

    Danke

  • PHP
    $index = 5;
    
    $cmd = "/usr/bin/gs -sDEVICE=pdfwrite -o code_1$index.pdf -dFIXEDMEDIA -c \"<</BeginPage{0.7 0.7 scale}>> setpagedevice\" -f ./inp$index.pdf";
    
    echo $cmd;

    Ergibt dann /usr/bin/gs -sDEVICE=pdfwrite -o code_15.pdf -dFIXEDMEDIA -c "<</BeginPage{0.7 0.7 scale}>> setpagedevice" -f ./inp5.pdf


    Aber aufpassen wenn Index durch einen User gesetzt werden kann. Dann sollte mindestens escapeshellcmd() oder escapeshellarg() verwendet werden.

    RS Brezn | VPS 500 G8 Plus | 2× VPS Karneval 2020 | VPS Pocket Admin | RS Cyber Quack | Webhosting EiWoMiSau


    Dieses Gebäude hat mir die Vorfahrt genommen! *hup*

  • Ich würd zusätzlich per regex als $index nur [a-z0-9] zulassen - sicher ist sicher :D

    Meine Minecraft-Plugins auf SpigotMC (Open Source): www.spigotmc.org/members/mfnalex.175238/#resources

    Discord: discord.jeff-media.com

  • Ich würde den String gleich mit sprintf() zusammenbauen, macht es ein wenig einfacher…

    PHP
    $index = 1337;
    
    $cmd = sprintf('/usr/bin/gs -sDEVICE=pdfwrite -o code_1%1$u.pdf -dFIXEDMEDIA -c "<</BeginPage{0.7 0.7 scale}>> setpagedevice" -f ./inp%1$u.pdf', $index);
    
    var_dump($cmd);
    // exec($cmd);

    Oder falls man die Argumente im Script leichter abändern bzw. hinzufügen möchte…

    (Getestet mit PHP 7.2)

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Ergibt dann

    Hab leider gerade nur wenig Zeit, aber: Hast du das getestet?

    Mein Problemn sind nicht die ", sondern die <<. Die werden nämlich anscheinend als redirect interpretiert und es bleibt dann nort nur <> übrig.


    Index ist eine automatisch erzeugte Zählvariable.

  • Hab leider gerade nur wenig Zeit, aber: Hast du das getestet?

    Mein Problemn sind nicht die ", sondern die <<. Die werden nämlich anscheinend als redirect interpretiert und es bleibt dann nort nur <> übrig.

    Ja, das Ergebnis habe ich so aus dem Output kopiert.

    RS Brezn | VPS 500 G8 Plus | 2× VPS Karneval 2020 | VPS Pocket Admin | RS Cyber Quack | Webhosting EiWoMiSau


    Dieses Gebäude hat mir die Vorfahrt genommen! *hup*

  • Ja, das Ergebnis habe ich so aus dem Output kopiert.

    in einer shell, oder in einem webbrowser?


    die zeilen:

    $index = 5;

    $cmd = "/usr/bin/gs -sDEVICE=pdfwrite -o code_1$index.pdf -dFIXEDMEDIA -c \"<</BeginPage{0.7 0.7 scale}>> setpagedevice\" -f ./inp$index.pdf";

    echo $cmd;


    ergeben bei mir einen output von:

    /usr/bin/gs -sDEVICE=pdfwrite -o code_15.pdf -dFIXEDMEDIA -c "<> setpagedevice" -f ./inp5.pdf

    und genau das ist mein problem.

  • Seltsam.

    Eure Beispiele (die ich auch schon vorher in etwa so durchgespielt hatte) ergeben bei mir allesamt: ...-dFIXEDMEDIA -c "<> setpagedevice" -f ...

    debian mit apache und php 7.0.33 Zend Engine v3.0.0 Zend OPcache v7.0.33 und aufgerufen mit Firefox.


    Hm, wenn ich es in der Shell aufrufe kommt die gewünschte Ausgabe.

    Aber weshalb klappt dann das exec nicht?

  • Hast du mal versucht es noch durch escapeshellcmd zu jagen? Da werden die spitzen (und geschweiften) Klammern dann escaped:


    Ohne escapeshellcmd:

    /usr/bin/gs -sDEVICE=pdfwrite -o code_15.pdf -dFIXEDMEDIA -c "<</BeginPage{0.7 0.7 scale}>> setpagedevice" -f ./inp5.pdf


    Mit escapeshellcmd:

    /usr/bin/gs -sDEVICE=pdfwrite -o code_15.pdf -dFIXEDMEDIA -c "\<\</BeginPage\{0.7 0.7 scale\}\>\> setpagedevice" -f ./inp5.pdf


    Getestet via CLI auf Ubuntu 20.04 (PHP 7.4.3).

    RS Brezn | VPS 500 G8 Plus | 2× VPS Karneval 2020 | VPS Pocket Admin | RS Cyber Quack | Webhosting EiWoMiSau


    Dieses Gebäude hat mir die Vorfahrt genommen! *hup*

  • Sorry für die späte Rückmeldung, es kamen dringendere Arbeiten dazwischen.

    Das mit dem escapen hatte ich alles schon von Hand versucht.

    Aber es hat sich auch erledingt, denn es war von Anfang an korrekt.

    Natürlich auch eure ersten Tipps, nach denen ich den String ja bereits vor der Frage aufgebaut hatte.

    Der Fehler lag im Aufbau der Dateinamen und er hat Sachen gesucht, wo sie nicht waren, oder wollte schreiben, wo er keine Berechtigung hatte.

    Habe ich aber erst heute gesehn, als ich mir das System mal genauer ansehn konnte.

    Danke für eure Hilfe! :)