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


Posted in PHP onMarch 06, 2007

领导要我策划一个网页设计大赛和Flash创作大赛,要求必须实现在线报名和上传作品。通过FreeBSD+Apache+PHP+Mysql+FTP我实现了该要求。

实现在线报名和上传作品的思路是利用网页表单收集用户填写的资料存储到Mysql数据库内,同时以该用户的注册名创建一个FTP上传账号并创建该用户的相应目录。

FTP服务器是系统默认带的,采用系统用户的用户名和密码,创建系统用户就等于创建FTP用户,FreeBSD是属于UNIX阵营的操作系统,它没有象Linux一样的useradd和groupadd等创建用户和组的命令,其取而代之的是pw命令加上相应参数来实现,在Freebsd上以管理员的身份创建一个用户的命令是

echo <passwd> | pw useradd <username> [-g][groupname] [-s][shelldir][-h 0]

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

如果是普通用户登陆的话还必须用到su命令,调用的方法是

su root ?c ‘echo <passwd> | pw useradd <username> [-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 相关文章推荐
如何使用PHP计算上一个月的今天
May 23 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
PHP实现文件上传功能实例代码
May 18 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
你真的了解PHP中的引用符号(&)吗
May 12 PHP
个人站长制做网页常用的php代码
Mar 03 #PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 #PHP
给php新手谈谈我的学习心得
Feb 25 #PHP
Smarty+QUICKFORM小小演示
Feb 25 #PHP
php简单封装了一些常用JS操作
Feb 25 #PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 #PHP
php公用函数列表[正则]
Feb 22 #PHP
You might like
用PHP读注册表
2006/10/09 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
python flask 多对多表查询功能
2017/06/25 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
2014年小学教师工作总结
2014/11/10 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
2014年维修工作总结
2014/11/22 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server