用PHP实现Ftp用户的在线管理
2015-01-24信息快讯网
最近接手一案子,要求必须实现在线报名和上传作品。通过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 Cc ‘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,就可以以新用户身份运行了。
下面可以创建PHP源文件checkin.php了,代码如下:
<?if (($username!="") and ($userpasswd!=""))//判断是否有表单提交了信息 { $rootpasswd="adminpassword"; //定义管理员密码 $creatuser ="su --login root -c 'echo ".$userpasswd." | pw useradd ".$username." -s /bin/ftponly -g ftpuser Cs /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>
PHP写的加密函数,支持私人密钥(详细介绍)
PHP版 汉字转码的实现详解
php批量上传的实现代码
PHP转换IP地址到真实地址的方法详解
探讨PHP删除文件夹的三种方法
使用session判断用户登录用户权限(超简单)
深入HTTP响应状态码速查表的详解
深入php-fpm的两种进程管理模式详解
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
基于initPHP的框架介绍
php简单开启gzip压缩方法(zlib.output_compression)
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
PHP生成随机用户名和密码的实现代码
无需重新编译php加入ftp扩展的解决方法
PHP管理内存函数 memory_get_usage()使用介绍
php线性表顺序存储实现代码(增删查改)
PHP排序算法的复习和总结
php网上商城购物车设计代码分享
php后台多用户权限组思路与实现程序代码分享
php _autoload自动加载类与机制分析
php 文本文件的读取效率
用phpmailer实现简单openvpn用户认证的实现代码
如何用phpmyadmin设置mysql数据库用户的权限
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
30 个很棒的PHP开源CMS内容管理系统小结
深入探讨PHP中的内存管理问题
判断Keep-Alive模式的HTTP请求的结束的实现代码
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
php获取后台Job管理的实现代码
php错误提示failed to open stream: HTTP request failed!的完美解决方法
php小型企业库存管理系统的设计与实现代码
The specified CGI application misbehaved by not returning a complete set of HTTP headers
php ftp文件上传函数(基础版)
php下连接ftp实现文件的上传、下载、删除文件实例代码
php实现从ftp服务器上下载文件树到本地电脑的程序