2012-02-29 3 views
1

저는 서버에서 서버 전체 해킹을 되돌리려 고 grep 문제로 씨름 해 왔지만, grep은 실행시 jpg 파일을 검색 할 수없는 것 같습니다. 쉘로 grep 명령은 ssh의 자체 작업 파일입니다. 이 반환jpg 파일에서 grep을 사용하여 찾아서 바꿉니다.

잘 결과 : 그렙 -l -R "nastycode"의/var/www /에서 가상 호스트

하지만 쉘 스크립트로 실행할 때, 그것은 JPG를을 더 이상 찾을 수 없습니다.

for file in $(grep -l -R "nastycode" /var/www/vhosts) 
do 
    sed -e "s/"nastycode"/"nicecode"/ig" $file > /tmp/tempfile.tmp 
    mv /tmp/tempfile.tmp $file 
    echo "Modified: " $file 
done 

Q :이 부분 '에 대한 파일'와 함께 할 수 있을까? Q : 우리의 검색 패턴 "nastycode"안에 regexp chars를 가지고 있지만 그것들을 보통 ($, | 등)으로 취급 할 수 있습니까?

미리 감사드립니다.

니콜라스

+0

난 당신이 무슨 뜻인지 모르겠어요 inside jpg files "- sed가 어떻게하면 바이너리 파일 (.jpg)에서 문자열을 검색하길 원한다는 뜻인가요? Re 'nastycode'는 정규 표현식과 반대되는 리터럴 문자열입니다.'-F' (또는'--fixed-strings')를 사용할 수 있습니다. 답장을 보내 주셔서 감사합니다. –

+0

내가 "JPG 파일 내에서 검색"이라고 말하면, 해커가 jpg 파일을 편집하고 파일에 PHP 코드를 추가했지만 여전히 사용자에게 jpg를 보여줍니다. (그들은 또한 htaccess 파일을 PHP로 jpg를 처리하고 코드를 실행하기 위해 추가되었습니다) –

+0

리터럴이 작동하지 않는 것 같습니다. 나는 스크립트를 쓸모 없게하기 위해 ") || stristr ("and replace ") && false || stristr ("스크립트를 쓸모 없게하려고 노력 중입니다 ... –

답변

0

grep는 한 더 뉴 라인이없는 특수 문자 (-F를) 무시하는 옵션이 있습니다. sed, 불행히도 이러한 옵션이 없습니다. 특수 문자가있는 경우 이스케이프 처리해야합니다. /을 많이 사용하는 경우 구분 기호 - s|old|new| 또는 [email protected]@[email protected] 또는 코드에 포함되지 않은 다른 문자를 변경하여 이스케이프 처리하지 않아도됩니다. 구조의 나머지 부분에 대해서는 몇 가지 의견이 있습니다. 첫째, 당신은 그 for file in command 구조를 절대 사용해서는 안되며, 공백을 깨뜨릴 것입니다. **을 사용하십시오 (shopt -s globstar 먼저 사용하도록 설정해야 할 수도 있음) 또는 find을 대신 사용하십시오. 다음으로, GNU sed의 인라인 옵션은 -i입니다. 백업 접미어를 지정할 수도 있습니다 (예 : -i.bak). sed은 패턴을 찾으면 바뀌기 때문에 grep을 사용하여 파일을 제한 할 이유가 없습니다.

, 모두 함께 그 퍼팅 (당신은 당신의 정규식 탈출 일단 - 당신이 그것을 필요로하는 경우에 우리는 그것도 도움이 될 수 있습니다) 이러한 사용할 수 있습니다 검색 "에 의해

# Globstar 
for file in /var/www/vhosts/**; do 
    sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' $file 
done 

# find 
find /var/www/vhosts -type f -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} \; 

# If you really want the echo notification 
find /var/www/vhosts -type f -exec grep -qiF ') || stristr($ua' {} \; -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} + -printf "Modified %p\n" 
+0

Kevin에게 감사드립니다. 저는 PHP 배경에서 왔으며이 일을하는 데별로 익숙하지 않았습니다. 그러나 어떤 이유로이 문제는 내 책상을 찾았습니다 :) 대체 할 실제 코드는 ") || stristr ($ ua", d) ") && false ||로 바꿉니다. stristr ($ ua ". 그 끈에서 벗어나도록 도와 주시겠습니까?나는 파일 소유권을 보존하지 않는다는 것을 알아 차리고 파일을 수정할 때 소유권을 root로 바꾼다. –

+0

예제를 가지고 놀면 'find :'-exec '에 인수가 없습니다. 난 어려운 문자열을 시도하기 전에 그것을 이해하기 위해 일반 문자열로 테스트하고 있습니다. –

+0

@ user1239330 좋아요, 실제 문자열로 업데이트했습니다. 검색에서'$'를, 대체에서'&'를 이스케이프하면됩니다. 마지막 예제에서'-F' 플래그를 주었기 때문에 grep에서'$'를 벗어나지 않았습니다. – Kevin

관련 문제