PHP escapeshellarg und wildcards?
-
Wie macht man sowas richtig?
system('rm '.escapeshellarg('*.jpg'));
-
Auch das ist kein Hexenwerk:
http://php.net/manual/de/function.escapeshellarg.php
-
EOP schrieb:
Auch das ist kein Hexenwerk:
http://php.net/manual/de/function.escapeshellarg.phpHast 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.
-
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.
Beirm *.tmp
sieht die Shell das Muster*.tmp
und ersetzt es durch alle Dateien, die darauf passen. Sie führt danach den Befehlrm 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.
Beirm *.tmp
sieht die Shell das Muster*.tmp
und ersetzt es durch alle Dateien, die darauf passen. Sie führt danach den Befehlrm 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.