php实现ftp用户的在线管理实例解析

发布时间:2020-05-28编辑:脚本学堂
本文介绍下,使用php实现ftp用户信息的在线管理的方法,很多搞主机托管的朋友应该接触过吧。有需要的朋友,可以参考下。

要求:
实现在线报名和上传作品。

实现:
FreeBSD+apache+PHP+mysql+FTP

思路:
利用网页表单收集用户填写的资料存储到mysql数据库内,同时以该用户的注册名创建一个FTP上传账号并创建该用户的相应目录。

Ftp服务器是系统默认已安装,采用系统用户的用户名和密码,创建系统用户就等于创建FTP用户,FreeBSD是属于UNIX阵营的操作系统,它没有象linux一样的useradd和
groupadd等创建用户和组的命令,其取而代之的是pw命令加上相应参数来实现。

Freebsd上以管理员身份创建用户,命令格式为:
echo | pw useradd [-g][groupname] [-s][shelldir][-h 0]

参数g指定用户组,参数s指定用户的shell。

普通用户登陆的话,必须用到su命令:
 

复制代码 代码示例:
su root –c ‘echo | pw useradd [-g][groupname] [-s][shelldir][-h 0] ’
 

执行之后系统会要求输入管理员密码,输入密码就可以以管理员的身份执行这个命令了。

难点:
如何通过PHP来调用上面这些系统命令去创建一个用户,本例是使用PHP中的popen()函数来实现的,该函数执行指令打开文件,语法是int popen(string command, string
mode),其打开的文件只能是单向的,只能读或只能写,对应的“string mode”为’r’或’w’,“string command” 就是命令字符串,在对文件的操作上可使用 fgets()、
fgetss()与fputs()函数,本例用fputs()函数往文件里面输入管理员密码。若是开档发生错误将返回 false 值,最后函数要记得调用pclose()关闭。

规划FTP用户的组,先用pw groupadd ftpuser创建ftpuse组,让在线申请的用户为这个组的成员。
为了安全起见,不应该给FTP用户Telnet权限,所以还要专门创建一个shell,使得这些成员不能通过Telnet正常登陆系统。

方法如下:
创建一个文件/bin/ftponly
 

复制代码 代码示例:
#!/bin/csh
/bin/cat << XX
You can ony use this username to login ftp server!
And you can not use it to telnet to this system! XX
sleep 10

该文件中XX之间就是显示给用telnet登陆的用户看的信息。信息显示10秒钟就自动退出了。最后不要忘记用chmod +x /bin/ftponly给这个文件可执行属性。

然后,在/bin/shell文件中添加“/bin/ftponly”,在以后的命令里面我们就可以利用pw中-s参数把这个shell指定给FTP用户了。

注意:
su命令仅仅是wheel管理组的用户成员才可以使用,当PHP调用su命令的时候也必须以wheel组成员的身份运行,否则系统拒绝运行,而PHP运行系统命令的身份就是Apache Web
服务器运行的身份,初始的用户名和用户组都是nobody,所以先得建立一个wheel组的用户www供apache使用,接着更改Apache的配置文件httpd.conf中的user为www,group为
wheel,重新启动Apache,就可以以新用户身份运行了。

下面创建checkin.php文件,代码如下:

<?php
/**
* ftp用户在线管理
* edit www.jb200.com
*/
if (($username!="") and ($userpasswd!=""))//判断是否提交表单  
{ $rootpasswd="adminpassword"; //定义管理员密码 
$creatuser ="su --login root -c 'echo ".$userpasswd." | pw useradd ".$username." -s /bin/ftponly  -g ftpuser –s /bin/ftponly -h 0' "; //这是利用su和pw命
令创建用户的用到的字符串 
$fp=popen($creatuser,"w"); //调用popen()函数执行字符串中的命令,返回文句柄给$fp 
fputs($fp,$rootpasswd); //写入管理员密码到文件$fp,相当于输入密码给系统 
pclose($fp);//关闭文件  
$creatdir="su --login root -c 'mkdir /home/".$username."'";//创建用户目录的命令字符串  
$fp=popen($creatdir,"w");//执行命令创建用户目录  
fputs($fp,$rootpasswd); //输入管理员密码 
pclose($fp);  
$creatdir="su --login root -c 'mkdir /home/".$username."/public_html'";  
$fp=popen($creatdir,"w"); //执行命令创建用户网站根目录 
fputs($fp,$rootpasswd); //输入管理员密码 
pclose($fp);  
$creatdir="su --login root -c 'chown ".$username." /home/".$username."'"; //改变用户目录的所有者为用户自己,初始为运行Apache的用户www。 
$fp=popen($creatdir,"w"); //执行命令 
fputs($fp,$rootpasswd); //输入管理员密码 
pclose($fp);  
$creatdir="su --login root -c 'chown ".$username." /home/".$username."/public_html'"; //改变网站根目录的归属 
$fp=popen($creatdir,"w");  
fputs($fp,$rootpasswd);  
pclose($fp);  
echo "恭喜".$username.",您的的FTP账号已经申请成功!请到FTP上登陆,请注意,您没有Telnet权限";} 
else{?> 
<html> 
<head> 
<title>申请FTP账号</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head> 
<body bgcolor="#FFFFFF"> 
<div align="center"> 
<p>申请FTP账号</p>  
<form method=POST action="<? echo $PHP_SELF; ?>"> 
<table width="36%" border="0"> 
<tr>  
<td width="40%">  
<div align="right">账号名称:</div> 
</td> 
<td width="60%">  
<input type="text" name="username"> 
</td> 
</tr> 
<tr>  
<td width="40%">  
<div align="right">密码:</div> 
</td> 
<td width="60%">  
<input type="password" name="userpasswd"> 
</td> 
</tr> 
<tr> 
<td colspan="2"><input type="submit" name="Submit" value="申请"></td> 
</tr> 
</table> 
</form> 
</div><?}?> 
</body> 
</html>