Löschen Sie Dateien mit Dateinamen, die unzulässige Zeichen enthalten

Löschen Sie Dateien mit Dateinamen, die unzulässige Zeichen enthalten

In /tmpdem Verzeichnis habe ich eine Datei mit diesem Dateinamen:

.<?php passthru($_GET['cmd']);echo 'm3rg3';?>

Ich kann diese Datei nicht mit normalen Mitteln entfernen und habe es mit Anführungszeichen für diesen Dateinamen versucht, jedoch ohne Ergebnis.

Was sollte ich als nächstes versuchen?

Antwort1

Verwenden Sie ls -li, um den Inode anzuzeigen, und entfernen Sie ihn dann mitfind

[root@server tmp]# ls -li .\<*
16163346 -rw-r--r-- 1 root root 0 Jun 23 12:02 .<?php  passthru($_GET[cmd]);echo 
[root@server tmp]# find . -inum 16163346 -exec rm -i {} \;
rm: remove regular empty file `./.<?php passthru($_GET[cmd]);echo'? y

Referenz:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Antwort2

Versuche dies:

rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>

Und für die Zukunft, wenn Sie wirklich seltsame Dateinamen haben, versuchen Sie, die Shell zu verwendenGlobusMechanismus, zum Beispiel:

ls .*php*

sollte ein guter Anfang sein. Wenn Sie viele Dateien mit ähnlichen Dateinamen haben, verwenden Sie einfach eine beliebige eindeutige reguläre Teilzeichenfolge

ls .*php*cmd*echo*m3rg3*

Und am Ende können Sie auf klicken, Tabum den Dateinamen zu vervollständigen, wenn die von Ihnen verwendete Shell über einen Vervollständigungsmechanismus verfügt.

Antwort3

rmglob patternsist ein kluges Tier, das Sie im Argument verwenden können

Für deinen Fall rm .\<*reicht ein einfaches

*Seien Sie vorsichtig bei der Verwendung rmmit glob patterns, da dadurch mehrere Dateien gelöscht werden, die dem Muster entsprechen

Antwort4

findGNU oder nicht GNU

Mit der GNU-Version findkönnen Sie direkt schreiben, ohne nach ihrem Inode suchen zu müssen,

find . -name '.<*' -delete

Natürlich empfiehlt es sich immer, es vorher ohne diese -deleteOption zu versuchen und die Namen der zu löschenden Dateien zu überprüfen.

Auch mit einer Nicht-GNU-Version ließe sich das direkt machen, find . -name '.<*' -exec rm -i {} \;das funktioniert auch mit der GNU-Version, nur etwa 3 mal langsamer [1] dann mit -delete.
Wenn es nicht zu viele Dateien sind, können Sie auch verwenden find . -name '.<*' -exec rm -i {} +, was wiederum schneller ist.

perl

Angenommen, .<*als Schlüssel wählt man alle und nur die Dateien aus, die man löschen möchte (nicht ohne einigeFitnessstudioauf der Saite)

perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'

Um alle versteckten Dateien des Verzeichnisses zu löschen, genügt esperl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

Bei vielen Dateien geht es schneller. Achten Sie auf den Ausdruck, da ich normalerweise nicht mit Perl arbeite.

Problemumgehung

Im Allgemeinen können Sie versuchen, alle anderen Dateien in ein anderes Verzeichnis zu verschieben und das ursprüngliche Verzeichnis zu löschen

mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2

Nachteile, wenn einige Dateien verwendet werden … aber es gibt Fälle, in denen Sie sie auch verwenden können.

P.S.: Vergiss nicht, die Option mit ... rsynczu aktivieren ./dev/null-delete

verwandte Informationen