
In /tmp
dem 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
rm
glob patterns
ist ein kluges Tier, das Sie im Argument verwenden können
Für deinen Fall rm .\<*
reicht ein einfaches
*Seien Sie vorsichtig bei der Verwendung rm
mit glob patterns
, da dadurch mehrere Dateien gelöscht werden, die dem Muster entsprechen
Antwort4
find
GNU oder nicht GNU
Mit der GNU-Version find
kö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 -delete
Option 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 ... rsync
zu aktivieren ./dev/null
-delete