여러 문자열이 포함된 파일 찾기

여러 문자열이 포함된 파일 찾기

일반적인 악성 코드가 포함된 스크립트를 찾으려고 하는데 각 파일에서 여러 문자열을 일치시켜야 합니다. 내가 사용하고 있는 것이 작동하고 있지만 왜 출력에 다음이 나타나는지 잘 모르겠습니다.

# egrep -rli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset'
grep: ./wp-content/themes/twentyfourteen/js/menu61.php
./wp-content/themes/twentyfourteen/themes.php
./wp-content/themes/twentytwelve/file68.php
./wp-content/themes/twentythirteen/inc/page.php
./wp-content/themes/twentythirteen/inc/template.php
./wp-content/upgrade/include.php
./wp-content/plugins/wp-slimstat/browscap/diff8.php
./wp-content/plugins/quick-contact-form/gallery56.php
./wp-content/plugins/addthis/css/include.php
./wp-content/plugins/addthis/includes/include.php
./wp-content/plugins/tpc-memory-usage/images/code77.php
./wp-content/plugins/gotmls/images/index.php
./wp-content/plugins/tinymce-advanced/langs/object56.php
./wp-content/plugins/wp-security-audit-log/dirs70.php
./wp-content/plugins/wp-security-audit-log/css/list76.php
./wp-content/plugins/wp-security-audit-log/proxy.php
./wp-content/plugins/image-widget/lang/alias.php
./wp-content/plugins/my-page-order/template.php
./wp-content/uploads/2015/01/footer87.php
./wp-content/menu.php
./wp-includes/js/thickbox/db.php
./wp-includes/js/jquery/ui/footer39.php
./wp-includes/js/imgareaselect/general.php
./wp-includes/css/page25.php
./wp-includes/Text/Diff/Engine/dump.php
: No such file or directory

출력은 양호하고 내가 원하는 것이지만 라인 1에 표시되는 이유는 다음과 같습니다.

grep: ./wp-content/themes/twentyfourteen/js/menu61.php

마지막 줄에는 항상 다음이 표시됩니다.

: No such file or directory

마지막으로 파일로 파이핑하는 것이 작동하지 않습니다.

# egrep -rli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset' >> asd

답변1

xargs인수 없이 실행 해 보세요 -0. 해당 매개변수는 xargsnull로 구분된 인수를 예상하도록 지시하지만 여기서는 그렇지 않습니다.

답변2

당신이 보는 것은 결과가 아니라 오류 메시지입니다. 존재하지 않는 파일을 검색하라는 메시지가 표시될 때 grep의 오류 형식은 grep: file name: No such file or directory다음과 같습니다.

$ grep foo bar
grep: bar: No such file or directory

그렇기 때문에 grep:시작과 No such file or directory끝에서 . 이는 출력을 파일로 리디렉션할 수 없고 표준 출력이 아닌 표준 오류로 인쇄되며 후자를 리디렉션하는 이유이기도 합니다. 2>>출력을 저장하는 대신 사용할 수 있습니다 >>. 그러나 이것은 오류이므로 원하는 것이 아닙니다.

문제는 null로 구분된 데이터가 필요함을 알리기 위해 -0with를 사용하고 있다는 것입니다. xargs데이터가 실제로 개행으로 구분되어 있으므로(각 파일은 한 줄에 있음) 해당 이름의 파일(전체 여러 줄 세트)을 찾도록 xargs지시합니다 . grep당신이하고 싶은 일은 :

 grep -Erli --include='*.php' 'return base64_decode' . | xargs grep -l 'isset'

grep또는 파일 이름에 개행 문자가 포함될 수 있고 이를 지원하는 버전이 있는 경우 grep의 -Z플래그를 사용하여 null로 구분된 출력을 생성합니다.

grep -ZErli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset'

또한 나는 및 를 사용하고 grep -E있으며 egrep각각 및 을 선호합니다 egrep.fgrepgrep -Egrep -F

관련 정보