
В /tmp
каталоге у меня есть файл с таким именем:
.<?php passthru($_GET['cmd']);echo 'm3rg3';?>
Я не могу удалить этот файл обычными способами и пробовал закавычить его имя, но безрезультатно.
Что мне следует попробовать дальше?
решение1
Используйте ls -li
, чтобы увидеть inode, затем удалите inode с помощьюfind
[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
Ссылка:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
решение2
Попробуй это:
rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>
И на будущее, если у вас действительно странное имя файла, попробуйте использовать оболочкушармеханизм, например:
ls .*php*
должно быть хорошим началом. Если у вас много файлов с похожими именами, просто используйте любую уникальную обычную подстроку
ls .*php*cmd*echo*m3rg3*
И в конце вы можете нажать , Tabчтобы завершить имя файла, если используемая вами оболочка поддерживает механизм завершения.
решение3
rm
умный зверь, можно использовать glob patterns
в аргументе
rm .\<*
Для вашего случая достаточно простого
*будьте осторожны при использовании rm
with, glob patterns
так как это приведет к удалению нескольких файлов, соответствующих шаблону
решение4
find
GNU или не GNU
С версией GNU find
вы можете писать напрямую, не ища их inode,
find . -name '.<*' -delete
Конечно, всегда рекомендуется сначала попробовать без этой -delete
опции и проверить имена файлов, которые вы собираетесь удалить.
С не-GNU версией это тоже можно сделать напрямую, find . -name '.<*' -exec rm -i {} \;
что также работает и с GNU версией, только примерно в 3 раза медленнее [1] затем с -delete
.
Когда файлов не так много, можно использовать тоже find . -name '.<*' -exec rm -i {} +
, опять же быстрее.
perl
Предположим .<*
, что ключ выбирает все и только те файлы, которые вы хотите удалить (не без некоторыхспортзална веревочке)
perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'
Чтобы удалить все скрытые файлы каталога достаточноperl -e 'for(<'.*'>){((stat)[9]<(unlink))}'
С большим количеством файлов это быстрее. Проверьте выражение, так как я обычно не работаю с perl.
Обходной путь
В общем случае вы можете попробовать переместить все остальные файлы в другой каталог и удалить исходный каталог.
mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2
Недостатки, если какой-то файл используется... но есть случаи, в которых вы тоже можете его использовать.
Ps> не забудьте rsync
про /dev/null
опцию -delete
...