用PHP实现Ftp用户的在线管理

实现在线报名和上传作品的思路是利用网页表单收集用户填写的资料存储到MysqL数据库内,同时以该用户注册名创建一个FTP上传账号并创建该用户的相应目录。
  Ftp服务器是系统默认带的,采用系统用户用户名和密码,创建系统用户就等于创建FTP用户,FreeBSD是属于UNIX阵营的操作系统,它没有象Linux一样的useradd和groupadd等创建用户和组的命令,其取而代之的是pw命令加上相应参数来实现,在Freebsd上以管理员的身份创建一个用户的命令是
<div class="codetitle"><a style="CURSOR: pointer" data="77097" class="copybut" id="copybut77097" onclick="doCopy('code77097')"> 代码如下:

<div class="codebody" id="code77097">
  echo | pw useradd [-g][groupname] [-s][shelldir][-h 0]

  参数g指定用户组,参数s指定用户的shell。
  如果是普通用户登陆的话还必须用到su命令,调用方法
<div class="codetitle"><a style="CURSOR: pointer" data="68811" class="copybut" id="copybut68811" onclick="doCopy('code68811')"> 代码如下:
<div class="codebody" id="code68811">
  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
<div class="codetitle"><a style="CURSOR: pointer" data="46785" class="copybut" id="copybut46785" onclick="doCopy('code46785')"> 代码如下:
<div class="codebody" id="code46785">
#!/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,就可以以新用户身份运行了。
下面可以创建PHP文件checkin.PHP了,代码如下:
<div class="codetitle"><a style="CURSOR: pointer" data="86306" class="copybut" id="copybut86306" onclick="doCopy('code86306')"> 代码如下:<div class="codebody" id="code86306">
<?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{?>


申请FTP账号
<Meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<body bgcolor="#FFFFFF">
<div align="center">

申请FTP账号


<form method=POST action="<? echo $PHP_SELF; ?>">
<table width="36%" border="0">
<tr>
<td width="40%">
<div align="right">账号名称:
</td>
<td width="60%">
<input type="text" name="username">
</td>
</tr>
<tr>
<td width="40%">
<div align="right">密码:
</td>
<td width="60%">
<input type="password" name="userpasswd">
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="Submit" value="申请"></td>
</tr>
</table>

<?}?>


Ftp用户在线管理

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...