用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 相关文章推荐
php preg_match_all结合str_replace替换内容中所有img
Oct 11 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
深入理解PHP之源码目录结构与功能说明
Jun 01 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
Yii框架函数简单用法分析
Sep 09 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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生成带有雪花背景的验证码
2006/10/09 PHP
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php cookis创建实现代码
2009/03/16 PHP
php抓取https的内容的代码
2010/04/06 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
php常用hash加密函数
2014/11/22 PHP
php简单防盗链实现方法
2015/07/29 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
Python zip()函数用法实例分析
2018/03/17 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
软件测试题目
2013/02/27 面试题
态度决定一切演讲稿
2014/05/20 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
房屋出售授权委托书
2014/10/12 职场文书
员工年终考核评语
2014/12/31 职场文书
《绝招》教学反思
2016/02/20 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
Python中time标准库的使用教程
2022/04/13 Python