파일에서 긴 문자열 제거

파일에서 긴 문자열 제거

내 서버의 파일이 손상되었습니다. 13000개의 문자열을 포함하는 모든 PHP 파일에서 이를 제거하고 싶습니다.

문자열은 다음과 같습니다.

?php if(!isset($GLOBALS["\x61\156\x75\156\x61"])) { $ua=strtolower($_SERVER[ ... $qhroczocgv=$qjhvvbyvyv; $qhroczocgv=(729-608); $boxknervrr=$qhroczocgv-1; ?>

간결함을 위해 줄임표가 삽입되었습니다.

검색 문자열을 사용 grep하면

grep: \![]$를 이스케이프 처리했음에도 불구하고 잘못된 역참조"

먼저 전체 문자열이 포함된 모든 파일을 찾은 다음 각 파일에서 텍스트를 제거하려면 어떻게 해야 합니까?

답변1

코딩 규칙이 양호하다고 가정하면 특정 크기보다 큰 행을 제거하십시오.

shopt -s extglob nullglob
sed -i.bak -r '/.{10000}/d' **/*.php

@wildcard의 경우:

find . -name '*.php' -print0 | while IFS= read -rd "" file; do
    before=$(wc -l < "$file")
    after=$(sed -r '/.{10000}/d' "$file" | wc -l)
    case $(( diff = before - after )) in
        0) :;;  # no-op
        *) echo "will remove $diff lines from $file";;
    esac
done

답변2

fgrep또는 를 사용해 보십시오 grep -F. 이렇게 하면 패턴이 고정 문자열로 해석됩니다.

또한 해당 단일 문자열을 파일에 (그 자체로) 넣고 이를 사용하여 grep -f filename파일을 지정할 수도 있습니다. 그러나 여전히 플래그 가 필요합니다 -F.

다른 옵션을 참조하세요 man grep. 유용할 수 있는 몇 가지 옵션이 있습니다.

특정 패턴과 일치하는 행을 삭제하는 다양한 방법은 다음을 참조하세요.https://stackoverflow.com/a/5413132/5419599.

한 가지 접근 방식은 다음과 같습니다.

  1. 이 텍스트 줄을 별도의 파일에 넣으십시오. 이를 "스키마 파일"이라고 부릅니다.
  2. 달리기grep -lrFf patternfile . > filelist
  3. filelist이 줄을 삭제하려면 편집하세요../patternfile
  4. 달리기for i in $(cat filelist) ; do grep -vf patternfile $i > temp && chmod --reference=$i temp && mv temp $i ; done

2단계에서 grep 옵션은 다음과 같습니다. -l일치하는 파일을 나열하고, -r일치 -F하는 패턴으로 고정 문자열을 사용하고, -f일치 patternfile하는 > filelist파일 목록을 포함하는 파일을 만듭니다.

4단계에서는 플래그를 grep사용하여 인쇄하세요.-v아니요행을 일치시킨 다음 chmod권한 문제가 없는지 확인하고 mv파일을 다시 제자리에 넣으십시오.

더 좋은 방법이 있을 수도 있지만 이 정도면 충분하다고 생각합니다.

편집 : 루트로 실행하면, 루트가 이러한 파일을 모두 소유하는 것은 아닙니다. 4단계의 다음 개정을 수행하십시오.

for i in $(cat filelist) ; do grep -vf patternfile $i > temp && chown --reference=$i temp && chmod --reference=$i temp && mv temp $i ; done

모든 파일의 소유자인 경우 초기 4단계는 괜찮습니다.

답변3

문자열이 파일에서 매우 고유하다고 가정하면 정규식을 사용하여 문자열의 주목할만한 부분을 찾아 a find및 a를 사용하여 sed replace전환할 수 있습니다.

 find . -name "*.php" -exec sed -i 's/?php.*strtolower.*qhroczocgv.*boxknervrr.*-1; ?>//g' {} \;

하지만 그 자리에 빈 줄이 남습니다.

이 문자열이 한 줄에 존재하는 유일한 문자열인지 알고 계십니까? 그렇다면 다음을 사용하여 단순화해 볼 수 있습니다.

find . -name "*.php" -exec sed -i 's/?php.*strtolower.*qhroczocgv.*boxknervrr.*-1; ?>//g' {} \;

php, 임의 개수의 다른 문자, strtolower, 임의 개수의 기타 문자, qhrozocgv, 임의 개수의 기타 문자, boxknervrr, 임의 개수의 기타 문자가 포함된 문자열을 찾습니다. 를 누른 다음 전체 줄을 삭제합니다.

또한 이 find섹션 에서는 .물론 현재 디렉터리를 나타내지만 원하는 디렉터리로 전환할 수 있습니다.

관련 정보