내 서버의 파일이 손상되었습니다. 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.
한 가지 접근 방식은 다음과 같습니다.
- 이 텍스트 줄을 별도의 파일에 넣으십시오. 이를 "스키마 파일"이라고 부릅니다.
- 달리기
grep -lrFf patternfile . > filelist
filelist
이 줄을 삭제하려면 편집하세요../patternfile
- 달리기
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
섹션 에서는 .
물론 현재 디렉터리를 나타내지만 원하는 디렉터리로 전환할 수 있습니다.