要求:
实现在线报名和上传作品。
实现:
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命令:
执行之后系统会要求输入管理员密码,输入密码就可以以管理员的身份执行这个命令了。
难点:
如何通过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/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,就可以以新用户身份运行了。
下面创建checkin.php文件,代码如下:
<?php
/**
* ftp用户在线管理
* edit www.
*/
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="/blog_article/</ echo $PHP_SELF; /gt;.html">
<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>以下是作为新手的我,自己实现的一个简单的用户注册功能,分享一下,供初学的同学参考,呵呵。
实现用户注册的功能,需要4个php页面,加入了一点点面向对象的思想。
1,form表单页面
<html>
<title>用户注册_www.</title>
<body>
注册:<br/>
<form action = "registerDeal.php" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/> <br/>
密码确认:<input type="password" name="passwordConfirm"/> <br/>
<input type="submit" value="OK"/>
</form>
</body>
</html>
2,//Entity 实体类 user.php
<?php
class User{
var $username;
var $password;
function User($username,$password){
$this->username = $username;
$this->password = $password;
}
}
?>
3,//表单处理php registerDeal.php
<?php
//include 'user.php'; //为什么不用添加呢?
include 'user_crud.php';
function save($username,$password){
echo "deal save";
$user = new User($username,$password);
$userDao = new UserDao();
$userDao->save($user);
}
if($_POST['username'] != NULL && $_POST['password'] !=NULL){
if($_POST['password'] != $_POST['passwordConfirm']){
echo "两次密码不一样";
}else{
save($_POST['username'] ,$_POST['password'] );
}
}else{
echo "用户名或密码不能为空";
}
?>
4,初级DAO对象 user_crud.php
<?php
include 'user.php';
class UserDao{
//处理数据库连接
function conn_mysql(){
mysql_connect()("localhost:3306", "root", "root")
or die("Could not connect : " . mysql_error());
print "Connected successfully";
mysql_select_db("forest") or die("Could not select database <br/>");
}
function UserDao(){
$this->conn_mysql();
}
function save($user){
echo("<br/> $user->username,$user->password");
$query = "insert into user(username,password) values ('$user->username','$user->password')";
mysql_query()($query) or die("Could not save user <br/>");
}
}
?>
总结及注意事项:
1,include包含文件问题,这点注意下相对路径与绝对路径,容易出错。
2,在写sql语句时,注意用引号包含起来 '$user->username',而不是这样:$user->username。
3,如果提示mysql库函数没有定义,记得在apache配置中指定php.ini的路径:PHPIniDir "E:/soft_work/PHP"
另外,高手朋友肯定会建议使用外部包含文件创建数据库连接类等,有兴趣的朋友,可以自己实践下。
代码如下:
<?
/**
* 用户注册示例
* edit www.
*/
php session_start();
$conn=mysqli_connect("localhost","root","root","reguser");
$conn->query('set names gb2312');
if(empty($conn))
{
die("数据库连接失败");
}
$UserName=$_POST['username'];
$pwd=$_POST['password'];
$email=$_POST['email'];
$sex=$_POST['sex'];
$time=time();
$code=strtolower()($_POST["code"]);
$str="select * from users where username='".$username."'";
$result1=$conn->query($str);
$row=$result1->fetch_row();
if($row)
{
$temp="已有人注册此名,请重新选择名字!";
echo $temp;
echo"<a href=/blog_article/zhuce.php>返回</a>/index.html";
}
else {
if( $_SESSION['sname']==$code)
{
echo $temp="认证码成功";
$sql="INSERT INTO users VALUES('$username', '$password','$email','$sex','$time')";
$result=$conn->query($sql);
if($result==true)
{
$_SESSION['mail']="注册成功,请登陆";
echo "<script>window.location.href='/blog_article/login1.html'</script>";
}
else {echo "注册失败".mysql_error();}
}
else {echo "认证码错误";}
}
?>
以上代码,接收注册页传来的参数,包括用户名,密码,邮箱,性别,验证码等。
然后,检测是否已注册过,否则将注册信息写入数据库。
很简单,特别适合新手朋友参考。