PHP escapeshellarg und wildcards?



  • Wie macht man sowas richtig?

    system('rm '.escapeshellarg('*.jpg'));
    




  • EOP schrieb:

    Auch das ist kein Hexenwerk:
    http://php.net/manual/de/function.escapeshellarg.php

    Hast echt einen so niedrigen Zähler 🙄

    vllt. hab ich vergessen, "system('rm '.escapeshellarg('*.jpg'));" funktioniert nicht...



  • Was heißt "funktioniert nicht" -- wird die Datei "*.jpg" nicht gelöscht?



  • Bashar schrieb:

    Was heißt "funktioniert nicht" -- wird die Datei "*.jpg" nicht gelöscht?

    Mit .jpg hab ich es nicht getestet, was nur ein kurzes Beispiel war. Aber ein absoluter Pfad '/home/panda/.jpg' wird nicht aufgelöst und dann natürlich die Datei nicht gefunden 😞

    System ist PHP 5.3 und Linux mit Bash 4.1



  • Ein absoluter Pfad muss nicht "aufgelöst" werden. Und was heißt, die Datei wird nicht gefunden? Bekommst du eine Fehlermeldung? Und bist du sicher, dass es an escapeshellargs liegt? Kannst du denn Dateien mit "vernünftigen" Namen löschen?



  • Most of the comments above have misunderstood this function. It does not need to escape characters such as '$' and '`' - it uses the fact that the shell does not treat any characters as special inside single quotes (except the single quote character itself). The correct way to use this function is to call it on a variable that is intended to be passed to a command-line program as a single argument to that program - you do not call it on command-line as a whole.

    Bitte lesen Herr SchlauSchlau.


  • Mod

    Ich möchte nur darauf hinweisen, dass system oder die anderen shell execute funktionen idR keine gute Idee sind.

    Wenn es sich um ein shellscript handelt dass man schreibt sind sie OK aber wenn es eine Webanwendung ist, dann ist das eine furchtbar schlechte Idee.



  • Hat dafür jetzt schon einer eine Lösung?



  • Bashar schrieb:

    Und was heißt, die Datei wird nicht gefunden? Bekommst du eine Fehlermeldung? Und bist du sicher, dass es an escapeshellargs liegt? Kannst du denn Dateien mit "vernünftigen" Namen löschen?

    panda@zoo:/var/www/easy/cron/tmp$ rm '*.tmp'
    rm: Entfernen von „*.tmp“ nicht möglich: Datei oder Verzeichnis nicht gefunden
    panda@zoo:/var/www/easy/cron/tmp$ rm *.tmp
    panda@zoo:/var/www/easy/cron/tmp$
    

    In dem Ordner waren 3 Dateien 1.tmp, 2.tmp und 3.tmp

    Bashar schrieb:

    Und bist du sicher, dass es an escapeshellargs liegt?

    Naja, nicht ganz. Es liegt IMHO an den "''" 😕



  • rm '*.tmp' löscht eine Datei, die *.tmp heißt.
    Bei rm *.tmp sieht die Shell das Muster *.tmp und ersetzt es durch alle Dateien, die darauf passen. Sie führt danach den Befehl rm 1.tmp 2.tmp 3.tmp aus.

    Ersteres macht man, wenn man eine Datei hat, die tatsächlich einen Stern (oder andere Shell-Sonderzeichen) enthält. Wenn man mit Wildcards arbeiten will, natürlich nicht.



  • Bashar schrieb:

    rm '*.tmp' löscht eine Datei, die *.tmp heißt.
    Bei rm *.tmp sieht die Shell das Muster *.tmp und ersetzt es durch alle Dateien, die darauf passen. Sie führt danach den Befehl rm 1.tmp 2.tmp 3.tmp aus.

    Ersteres macht man, wenn man eine Datei hat, die tatsächlich einen Stern (oder andere Shell-Sonderzeichen) enthält. Wenn man mit Wildcards arbeiten will, natürlich nicht.

    Okay, ich will/muss mit Wildcards arbeiten. Also durch welche Funktion muss ich '/hallo welt*.jpg' jagen, damit ich das mit system('rm'.funktion('/hallo welt*.jpg')) ausführen kann 😕



  • system('rm '.funktion('/hallo welt*.jpg'))
    

    Sry, Leerzeichen vergessen.



  • Durch gar keine. Gehört das Leerzeichen zum Dateinamen? Dann musst du per Hand escapen:

    system('rm /hallo\ welt*.jpg');
    


  • Bashar schrieb:

    Durch gar keine. Gehört das Leerzeichen zum Dateinamen?

    Nein, die werden automatisch generiert und enthalten keine Leerzeichen. Hätte aber zukünftig gerne die Funktion so erweitert, dass alle Dateinamen funktionieren...

    Bashar schrieb:

    Dann musst du per Hand escapen:

    Ist das dann für alle Syteme identisch (Linux/Windows/Mac)?



  • Bashar schrieb:

    Durch gar keine. Gehört das Leerzeichen zum Dateinamen? Dann musst du per Hand escapen:

    system('rm /hallo\ welt*.jpg');
    

    Der Vollständigkeit halber: Die maximale Länge einer command line ist limitiert durch den Kernel. Bei vielen Dateien kann man an dieses Limit stoßen, in diesem Fall schlägt der rm-Aufruf fehl.


Anmelden zum Antworten