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

领导要我策划一个网页设计大赛和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>

(0)

相关推荐

  • PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)

    复制代码 代码如下: <?php/*** 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 )* 时间:2006/5/9* 作者:欣然随风* QQ:276624915*/class class_ftp{    public $off; // 返回操作状态(成功/失败)    public $conn_id; // FTP连接    /**     * 方法:FTP连接     * @FTP_HOST -- FTP主机     * @FTP_PORT -- 端口     * @FTP_USER

  • php实现从ftp服务器上下载文件树到本地电脑的程序

    复制代码 代码如下: /* 用ftp_nlist()函授时,返回的数组值会有两种类型:因服务器不同而异 a:单独的文件名 b:包含目录的文件名. 如果挪用,请注意更改此处. */ <?php function download_file($dir,$fc,$_FILE_) { $fn=ftp_nlist($fc,".");//列出该目录的文件名(含子目录),存储在数组中 $size=sizeof($fn); $dir=($dir=="")?$dir:('/'.

  • php建立Ftp连接的方法

    本文实例讲述了php建立Ftp连接的方法.分享给大家供大家参考.具体分析如下: 今天看了下ftp函数,总结一下: FTP相关函数: ftp_connect(host,part,timeout)   建立新的ftp连接,host是要连接的服务器,part是端口,默认21,timeout是网络连接超时时间 ftp_login(con,user,password)  登陆ftp,con是上行建立的ftp连接.还有用户user和密码password ftp_close(con)    关闭con这个连接

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

    实现在线报名和上传作品的思路是利用网页表单收集用户填写的资料存储到Mysql数据库内,同时以该用户的注册名创建一个FTP上传账号并创建该用户的相应目录. Ftp服务器是系统默认带的,采用系统用户的用户名和密码,创建系统用户就等于创建FTP用户,FreeBSD是属于UNIX阵营的操作系统,它没有象Linux一样的useradd和groupadd等创建用户和组的命令,其取而代之的是pw命令加上相应参数来实现,在Freebsd上以管理员的身份创建一个用户的命令是 复制代码 代码如下: echo | p

  • PHP实现ftp上传文件示例

    FTP上传是PHP实现的一个常见且非常重要的应用技巧,今天就来与大家分享一下PHP实现FTP上传文件的简单示例.希望对大家的PHP学习能带来一定的帮助. 主要代码如下: function make_directory($ftp_stream, $dir){ // if directory already exists or can be immediately created return true if ($this->ftp_is_dir($ftp_stream, $dir) || @ftp

  • php中FTP函数ftp_connect、ftp_login与ftp_chmod用法

    本文实例讲述了php中FTP函数ftp_connect.ftp_login与ftp_chmod用法.分享给大家供大家参考.具体方法如下: ftp_connect() 函数建立一个新的 ftp 连接,若成功,则返回一个连接标识,否则返回 false. 语法:ftp_connect(host,port,timeout),实例代码如下: 复制代码 代码如下: $file='public_html/index.php';         //定义文件 $conn_id=ftp_connect($ftp_

  • php ftp文件上传函数(基础版)

    复制代码 代码如下: <?php // 定义变量 $local_file = 'local.zip'; $server_file = 'server.zip'; // 连接FTP服务器 $conn_id = ftp_connect($ftp_server); //验证登录服务器 $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 下载文件 if (ftp_get($conn_id, $local_file

  • php中ftp_chdir与ftp_cdup函数用法

    本文实例讲述了php中ftp_chdir与ftp_cdup函数用法.分享给大家供大家参考.具体用法如下: ftp_chdir()函数 若成功,则返回 true,否则返回 false,如果切换目录失败,php还会发出一条警告. 语法:ftp_chdir(ftp_connection,directory) 参数 描述 ftp_connection 必需,规定要使用的 ftp 连接,ftp 连接的标识符. directory 必需,规定要切换到的目录. 复制代码 代码如下: //设置基础连接 $con

  • 深入PHP FTP类的详解

    FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是Active,主动方式),一种是 Passive (也就是PASV,被动方式). Standard模式 FTP 的客户端发送 PORT 命令到FTP server.Passive模式FTP的客户端发送 PASV命令到 FTP Server.下面介绍一个这两种方式的工作原理: Standard模式FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道 发送命令,客户端需要接收数据的时候在这个通

  • PHP中FTP相关函数小结

    本文实例讲述了PHP中FTP相关函数.分享给大家供大家参考,具体如下: <?php set_time_limit(0); //转存本地地址 define( 'STORE_PATH', dirname(__FILE__) . '/../../../../temp_data/test/' ); define('LIST_PATH', STORE_PATH . 'list/'); define('CHAPTER_PATH', LIST_PATH . 'chapter/'); define('DETAI

  • php下连接ftp实现文件的上传、下载、删除文件实例代码

    php ftp传送文件到服务器 复制代码 代码如下: <?php // 开始 $ret = ftp_nb_get ($my_connection, "test", "README", FTP_BINARY, filesize("test")); // 或: $ret = ftp_nb_get ($my_connection, "test", "README", // FTP_BINARY, FTP_A

随机推荐