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

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

디렉토리 에 /tmp다음 파일 이름의 파일이 있습니다.

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

일반적인 방법으로는 이 파일을 제거할 수 없으며 이 파일 이름을 인용하여 시도했지만 결과가 없었습니다.

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

답변1

inode를 확인하는 데 사용하여 ls -liinode를 제거합니다.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

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

관련 정보