나는 모든 PHP 파일을 검색하고 정규식으로 식별되는 특정 문자열을 찾는 것을 좋아합니다.
문자열을 찾는 데 사용하는 정규식은 다음과 같습니다.
\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)
나는 다음을 사용하려고합니다 :
grep -r "\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)" *.php
그러나 이것은 작동하지 않는 것 같습니다.
find . -name '*.php' -regex '\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)' -print
아니요.
위의 정규식으로 식별된 문자열이 포함된 PHP 파일의 경로와 모든 하위 디렉터리를 검색해야 합니다. 이를 달성하는 가장 좋은 방법은 무엇입니까?
참고로 제가 찾으려는 문자열과 유사한 문자열은 다음과 같습니다.
<?php
$tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = Array();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu[15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] = ... etc.
아시다시피 이는 악성 코드입니다. 따라서 문자열은 비슷하지만 각 파일마다 다릅니다. 그러나 정규식 코드는 유사한 내용이 어딘가에 포함되어 있는 경우 모든 파일을 찾는데 잘 작동합니다.
이전에는 모든 파일을 Windows PC에 다운로드한 다음 EEMeditor를 사용하여 정규식으로 검색했습니다. 이것은 PC에서는 잘 작동하지만 이를 위해서는 모든 것을 다운로드해야 하며 Linux 명령 프롬프트에서 직접 검색할 수 있으면 좋을 것입니다.
어떤 조언이라도 대단히 감사하겠습니다.
답변1
정규식을 사용하여 검색 하므로 기본적으로 검색 문자열이 다음과 같이 해석된다는 점에 grep
주의해야 합니다.grep
기본 정규식(BRE). 사용하는 구문에는 다음이 포함됩니다.확장하다정규식(ERE) 구문이므로 이 플래그를 사용해야 합니다 -E
.
게시한 문자열 예제를 파일에 복사하여 test.php
호출합니다.
~$ grep -E '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8 }\s=\s[a-zA-Z0-9]{5}\(\)' *.php $tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = 배열();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu [15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] =...잠깐
문자열이 발견되었으므로( 강조 표시된 대로 굵게 출력됨 grep
) -r
옵션과 함께 사용하여( GNU 를 사용하는 것 같으므로 grep
) 재귀적으로 찾을 수 있습니다.
또한 -regex
해당 옵션을 기억하십시오 find
.아니요파일이 있는지 확인콘텐츠정규식과 일치하지만 파일의 경우이름성냥. .php
다음을 사용하여 정규식 기반 검색을 수행하려면.txt
find
find . -type f \( -name '*.php' -o -name '*.txt' \) -exec grep -EH '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s=\s[a-zA-Z0-9]{5}\(\)' {} \;
파일 이름이 인쇄되도록 보장하는 -H
옵션은 무엇 입니까? grep
또는 다음을 사용하십시오.grep -El etc.
오직파일 이름을 인쇄합니다(일치하는 파일이 많을 경우 출력이 더 명확해집니다).
몇 가지 일반적인 의견
Stéphane Chazelas가 올바르게 지적하고 향후 독자를 위한 참조로서 다음과 같이 구문의 여러 요소는 정규식 구문의 이식 불가능한 확장이며 다른 구성은 환경 설정에 따라 다르게 작동할 수 있습니다.
문자 클래스(혼동하지 마십시오.캐릭터 목록)은 표준 ERE의 확장입니다. 예를 들어 약칭 개념은
\s
정규식에 대한 Perl 확장이며 정규식을 처리하도록 설계된 프로그램 간에 반드시 이식 가능한 것은 아닙니다.문자 목록(예: )의 범위 지정 의미는
[a-z]
특히 로케일에 따라 달라질 수 있습니다.순서 정렬. "순진한" 해석은 지역적으로[a-z]
만 정확합니다 . 다른 문맥에서는 일반적으로 의미하므로 주의해서 사용해야 합니다(참조).abcdefgh....xyz
C
aAbBcCdD ... xXyYz
여기그리고여기이 주제에 대한 추가 논의를 위해). 사용 중인 프로그램이 이를 지원하는 경우 문자 클래스가 "더 안전"할 수 있지만 위에서 언급한 것처럼 이 사양이 표현되는 방식으로 반드시 이식 가능한 것은 아닙니다(예를 들어 사용 의도는[a-zA-Z0-9]
POSIX 문자 클래스를 통해 달성됩니다[[:alnum:]]
). .\=
및 와 같이 정규식(대부분의 구현)에서 실제로 특별한 의미가 없는 여러 문자를 이스케이프했습니다\;
. 이는 많은 경우에 작동할 수 있습니다(awk
예를 들어 GNU 매뉴얼 페이지에 나와 있음).\c
리터럴 문자c
"문자열 상수" 섹션 참조). 그러나 정규식을 다른 프로그램/환경(예:
vim
,\=
실제로는ㅏ정규식 수량자), 동일한 프로그램의 향후 버전에서도 마찬가지입니다.