在虚拟主机上架设NOD32升级服务器

Linux, PHP, 技术心得 Add comments

  常给朋友和同事推荐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:

  1. Directory Opus 联网验证被封证书后,清除安装痕迹的方法
  2. Reload

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">


LilyStudio & WordPress & N.Design Studio
Entries RSS Comments RSS Log in