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


Posted in PHP onFebruary 16, 2012

实现在线报名和上传作品的思路是利用网页表单收集用户填写的资料存储到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,就可以以新用户身份运行了。
下面可以创建PHP源文件checkin.php了,代码如下:

<?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>
PHP 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
php数组总结篇(一)
Sep 30 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
PHP框架Laravel学习心得体会
Oct 28 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 PHP
ThinkPHP实现分页功能
Apr 28 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
PHP sdk实现在线打包代码示例
Dec 09 PHP
PHP排序算法的复习和总结
Feb 15 #PHP
php网上商城购物车设计代码分享
Feb 15 #PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 #PHP
php _autoload自动加载类与机制分析
Feb 10 #PHP
php 文本文件的读取效率
Feb 10 #PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 #PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 #PHP
You might like
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
时尚休闲吧创业计划书
2014/01/25 职场文书
幼教求职信
2014/03/12 职场文书
家教广告词
2014/03/19 职场文书
大专毕业生求职信
2014/07/05 职场文书
庆祝教师节活动总结
2015/03/23 职场文书