이름에 허용되지 않는 문자가 포함된 파일 삭제

이름에 허용되지 않는 문자가 포함된 파일 삭제

/tmp디렉토리 에는 다음과 같은 파일 이름을 가진 파일이 있습니다.

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

일반적인 방법으로는 이 파일을 삭제할 수 없으며 이 파일 이름을 참조하려고 시도했지만 결과가 없습니다.

다음에는 무엇을 시도해야 합니까?

답변1

ls -li인덱스 노드를 본 다음 다음을 사용하여 인덱스 노드를 삭제하는 데 사용합니다.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

rmglob patterns당신이 논쟁에 사용할 수 있는 영리한 짐승이다

귀하의 경우에는 간단하면 rm .\<*충분합니다

rmglob patterns*with를 사용하면 패턴과 일치하는 여러 파일이 삭제되므로 주의하세요.

답변4

findGNU 또는 비 GNU

GNU 버전을 사용하면 findinode를 찾지 않고도 직접 작성할 수 있습니다.

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

관련 정보