常给朋友和同事推荐NOD32,但是给他们装的时候往往没有升级服务器可用,他们既不会自己上网去搜索一些免费的升级地址,我也不大方便把drl的服务器给他们用——于是决定自己架设一个。
自己没有架在公众网的服务器,只有虚拟主机,到底能不能做到呢?下面就以我的HostMonster主机为例,来一步步尝试。
所需条件:支持SSH、cron的主机。
一、安装unrar
nod32升级的第一步就是下载update.ver文件,这是一个更新包的列表文件,用于增量升级。要命的是这个文件是rar包——天知道他们怎么想的——绝大多数商业的虚拟主机由于版权的原因不可能预装rar,所以我们只能自己装一个。
首先创建一个目录,建议在public_html之外,即无法通过apache访问到的目录,用于存放rarlinux程序文件。然后从官方网站下载rarlinux
http://www.rarlab.com/rar/rarlinux-3.6.0.tar.gz
解压
tar zxvf rarlinux-3.6.0.tar.gz 这里要注意的是,Debian系统用3.6以下或以上的版本都会出现库文件错误,只有3.6不需要任何折腾就能使用,反正只是用来解压缩一个文件,还是老老实实用3.6吧。
解压之后得到rar目录,unrar就在目录中,无须安装,由于没有权限,就不要用make install了,反正不安装也能用。
二、编写升级脚本
这里使用php脚本自动从升级服务器下载文件,假设wget在系统中路径是/usr/bin/wget,unrar(刚才解压出来的地址)是/home/rar/unrar,我们升级文件的绝对路径为/home/public_html/nod32/,实际公开的地址是nod32.a.com,上层升级服务器是nod32.b.com/nod32/,用户名a,密码b(以上全都是虚构),那么脚本如下(抄袭自drl的jindui,根据我的情况略有修改,并修改了一处BUG)
文件”v3.php”
< ? $base='/home/public_html/nod32/'; $LOCALDIR = $base; $UPDATEDIR = $base; $TEMPDIR = $base.'tmp/'; $WGET = "/usr/bin/wget --user-agent='ESS Update (Windows; U; 32bit; VDB 1924; BPC 3; OS: 6.0.6000 SP 0.0 NT; CH 1.1; LNG 1033; x32c;' "; $UNRAR = '/home/rar/unrar'; $UPDATE_SERVER = 'http://nod32.b.com/'; $updateurl="${UPDATE_SERVER}/nod32/update.ver"; include("nod32.php"); ?>
文件”nod32.php”
< ? $UNRAR = '/home/rar/unrar'; $update="${UPDATEDIR}update.ver"; $updatetmp="${UPDATEDIR}update.tmp"; $USER = 'a'; $PASS = 'b'; //$ignore = array('fr.nup', 'ge.nup', 'it.nup', 'jp.nup', 'pl.nup', 'pt.nup', 'sk.nup', 'sp.nup', 'hr.nup', 'hu.nup', 'nl.nup'); if (!is_dir($LOCALDIR)) mkdir($LOCALDIR); if (!is_dir($UPDATEDIR)) mkdir($UPDATEDIR); if (!is_dir($TEMPDIR)) mkdir($TEMPDIR); //copy($update,$updatetmp); exec("$WGET -t 15 -T 60 -N -nH -nd -P $UPDATEDIR $updateurl", $output, $ret); /*$md51=exec("md5 -q $update"); $md52=exec("md5 -q $updatetmp"); unlink($updatetmp); if($md51==$md52) { echo "no update need !"; exit; }*/ if ($ret > 0) { echo 'Failed while downloading update.ver.'; exit; } exec("$UNRAR x -y -o+ {$UPDATEDIR}update.ver {$TEMPDIR}", $output, $ret); $content = file_get_contents("{$TEMPDIR}update.ver"); preg_match_all("/file=(\/[\/a-z0-9\-\_\.]+)\W+size=([0-9]+)\W/ise", $content, $matches); $list = ''; foreach($matches[1] as $num=>$file) { $file = substr(trim($file),1);//这句话我修改了一下,将字符串开头的"/"去掉了 //否则地址会有两个"/",造成文件大小无法比对,每次都会重新下载全部的文件) $size=$matches[2][$num]; $filesize=filesize($base.$file); if($size!=$filesize){ $list .= "{$UPDATE_SERVER}$file\r\n"; } else { echo "the file size of $file is same, skip \n"; } } /* preg_match_all("/file=(.+?)\n/ie", $content, $matches); $list = ''; foreach($matches[1] as $match) { $match = trim($match); $last = substr($match, -6); if (!in_array($last, $ignore)) $list .= "{$UPDATE_SERVER}$match\r\n"; } */ #file_put_contents('list.txt', $list); $handle = fopen("list.txt", "w"); fwrite($handle, $list); fclose($handle); exec("$WGET --http-user=$USER --http-passwd=$PASS -t 15 -T 60 -m -nH -P $LOCALDIR -i list.txt", $output, $ret); if ($ret > 0) { echo 'Failed while downloading files.'; exit; } echo 'Updated successfully.'; ?>
现在从浏览器访问v3.php(这两个脚本无所谓放在哪里,只要是能通过apache访问到的目录就行,建议单独设置目录以便我们下面说的安全保护),就已经可以成功下载文件了。
三、安全保护
为了不让普通用户主动运行升级脚本,也不让别人可以查看你的上层升级服务器的地址,我选择了密码保护,直接在HostMonster的控制面板里设置就行了,否则自己写文件有点麻烦。对你存放v3.php和nod32.php的目录设置一个用户名和密码,我们这里假设用户名是abc,密码是123。将一个单独的子域名(例如abc.a.com)指向这个目录。用浏览器访问就会弹出提示输入用户名密码的对话框。这无所谓,反正我们只要用lynx就行——一个Linux命令行下的浏览器(其实wget也行)。
运行这个命令
/usr/bin/lynx -cfg=/dev/null -source -auth=abc:123 http://abc.a.com/v3.php
其中-cfg参数是指定配置文件,这里指定为空(否则会出错),-source表示纯字符串输出,-auth是密码验证的功能。
可以看到输出一串结果,说明下载成功或者文件已存在不用下载。
然后用同样的方法对下载来的文件存放的目录即本例中的/home/public_html/nod32/设置一个密码,是用来发布给别人升级时用的,记得不要和前面那个一样哦。
四、定时运行任务
要让php脚本定时运行,虽然也可以用CGI方式运行php,但是我还是倾向于用浏览器,这样较为安全。
编写一个nod32.sh文件(假设你的sh在/bin/,lynx在/usr/bin/,不清楚的话可以用whereis sh查到),同样放在apache无法取到的目录下,假设还是放在/home/rar/
#!/bin/sh /usr/bin/lynx -cfg=/dev/null -source -auth=abc:123 http://abc.a.com/v3.php
然后在虚拟主机的控制面板里设置Cron任务,更新频率每12小时吧,命令为
/bin/sh /home/rar/nod32.sh
这样就完成了,你的程序会自动定时去上层服务器下载升级文件并存放在/home/public_html/nod32/,你只需要设置nod32.a.com指向该目录,就可以公开发布这个地址了。
最后,公布一下我自己建的NOD32升级服务器
Related posts:
Recent Comments