T086学习网 | 站长学院 | 技术文档 | 成语 | 歇后语 | 帝国时代 | 代码收藏 | IP地址查询 | 生活百科 | 生日密码 | CSS压缩 | 用户评论 | 欣欣百宝箱

ProFTPD 支持MySQL数据库添加虚拟用户认证及Quotas(磁盘限额)

【 来源:LinuxSir.Org作者:北南南北 更新时间:2006-10-10 | 字体:
[导读]作者:北南南北来自:LinuxSir.Org摘要:本文讲述了ProFTPD 支持MySQL数据库认证,比如添加虚拟用户、用户空间大小的限制(磁盘限额 Quotas);本文是实践文档; 目录 0、前言 1、什么是ProFTPD; 2、ProFTPD的编译和...

7、关于ProFTP的服务器管理、用户管理和磁盘限额管理

7.1 ProFTPD 服务器的管理;

ProFTPD服务器的启动程序是在安装目录的sbin中,也就是proftpd;我们还是以安装目录/opt/proftpd 为准来说明;

[root@localhost ~]# /opt/proftpd/sbin/proftpd 注:服务器的启动;
[root@localhost ~]# pgrep proftpd 注:查看服务器是不是启动起来了;如果没有进程,说明失败;
[root@localhost ~]# pkill proftpd 注:杀死proftpd的进程;也就是关掉服务器;

注意:我们更改proftpd.conf后,要重启proftpd ,否则改动不会生效。这时就要用到pkill proftpd ,然后再重启proftpd 服务器;每次改动proftpd.conf都要这么做;

下面是几个查看ProFTPD服务器状态的命令,您也可以尝试一下,具体用法自己尝试吧;

[root@localhost ~]# /opt/proftpd/bin/ftpcount
[root@localhost ~]# /opt/proftpd/bin/ftpwho
[root@localhost ~]# /opt/proftpd/bin/ftptop
[root@localhost ~]# /opt/proftpd/bin/ftpdctl




7.2 通过MySQL来管理FTP用户

在本文档中,ProFTPD 对FTP用户是通过MySQL来进行的,现在我们分析一下我们前面所提到proftpd数据库;ftp所有的用户都装在ftpusers这个表中,我们先分析一下这个表;分析这个表的目的是我们能明白如何添加用户;

首先,我们以proftpd 用户和密码登录到MySQL;并查看ftpusers表的结构;

[root@localhost ~]# mysql -uproftpd -p
Enter password: 注:在这里输入proftpd用户的密码;
mysql> 注:成功进入;

mysql> show databases; 注:查看数据库都有哪些;
+----------+
| Database |
+----------+
| proftpd |
| test |
+----------+
2 rows in set (0.00 sec)
注:我们看到了proftpd 还是存在的;

mysql> use proftpd; 注:要对proftpd 数据库进行操作,我们要先USE(用)proftpd数据库;

mysql> show tables; 注;我们在执行use proftpd;后,我们再查看proftpd中所有的表;
+-------------------+
| Tables_in_proftpd |
+-------------------+
| ftpgroups |
| ftpusers |
| quotalimits |
| quotatallies |
+-------------------+
4 rows in set (0.00 sec)

我们要查看ftpusers 这个表的结构,我们要用到 DESCRIBE 这个指令,后面接表的名称;

mysql> DESCRIBE ftpusers;
+-----------+------------------+------+-----+---------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------------+-------+
| userid | varchar(30) | | PRI | | |
| passwd | varchar(80) | | | | |
| uid | int(10) unsigned | | | 1000 | |
| gid | int(10) unsigned | | | 1000 | |
| homedir | varchar(255) | | | | |
| shell | varchar(255) | | | /sbin/nologin | |
| count | int(10) unsigned | | | 0 | |
| host | varchar(30) | | | | |
| lastlogin | varchar(30) | | | | |
+-----------+------------------+------+-----+---------------+-------+
9 rows in set (0.00 sec)

说明:

userid 就是FTP的用户名,这个是必填写字段;
passwd 是FTP用户的密码,这个是必填写字段;
uid和gid字段默认是1000;
homedir 是FTP用户的家目录放在哪里,要自己指定;
shell 这个是用来指定用户是否能登录系统,这里默认的是不能登录,因为是虚拟用户,所以不能让虚拟用户来登录系统;所以默认是/sbin/nologin;
count 是访问次数,默认是0;
host 是登录FTP服务器的IP地址记录,可以不设置;服务器会自己纪录;
lastlogin 是最后登录时间,这个也是自动生成,可以不必理会;

如何添加用户呢?

其实添加用户的过程,也就是向proftpd 数据库中的表ftpusers插入纪录的过程;我们上面分析了表的结构;那我们就按其要求来插入用户纪录;

我们看看ftpusers的表中,有哪些纪录;


mysql> select * from ftpusers;
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
| userid | passwd | uid | gid | homedir | shell | count | host | lastlogin |
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
| test | test | 1000 | 1000 | /home/test | /bin/bash | 8 | 127.0.0.1 | 2006-01-02 13:03:10 |
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
1 row in set (0.01 sec)

尝试插入一条纪录

比如我们想加一个用户,用户名为test2,密码为test2,UID和GID为都为1000,家目录位于/home/test2;值得注意的是UID和GID的只能是1000,因为我们在系统用户设置中做了改动;前面有提到;我们添加所有的FTP用户UID和GID都是 1000;

所以如果您添加用户时,只是改一下userid、passwd和homedir字段处就行了。其它不必改动,当然您非常性MySQL也没有什么不可;

INSERT INTO `ftpusers` VALUES ('test2', 'test2', 1000, 1000, '/home/test2', '/sbin/nologin',0,'','');

查看是否插入成功

mysql> select * from ftpusers;
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
| userid | passwd | uid | gid | homedir | shell | count | host | lastlogin |
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
| test | test | 1000 | 1000 | /home/test | /bin/bash | 8 | 127.0.0.1 | 2006-01-02 13:03:10 |
| test2 | test2 | 1000 | 1000 | /home/test2 | /sbin/nologin | 0 | | |
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
2 rows in set (0.00 sec)

再举一例;添加一个用户名为test3,密码为test3 ,并且把test3的家目录放在/opt/test3中;

mysql> INSERT INTO `ftpusers` VALUES ('test3', 'test3', 1000, 1000, '/opt/test3', '/sbin/nologin',0,'','');

添加好后,测试一下用户test3是否能登录,并且上传文件;下面的例子证明是成功的;

[root@localhost ~]# lftp test3:test3@localhost
lftp test3@localhost:~> ls
lftp test3@localhost:/> put /home/beinan/fcitx-3.2-051108.tar.bz2
4164490 bytes transferred
lftp test3@localhost:/> ls
-rw-r--r-- 1 test3 ftp 4164490 Jan 2 06:08 fcitx-3.2-051108.tar.bz2
lftp test3@localhost:/>

如果你想删除一个用户,您可以用 MySQL的delete 指令;比如我想删除test2这个用户;可以用.....

mysql> DELETE FROM ftpusers WHERE userid="test2";

如果想更新一条用户纪录,比如test用户密码字段;

mysql> update ftpusers set passwd="aaasss" where userid="test";

也就是说,你想更新用户纪录的那个字段就更新什么,下面公式;

mysql>update 数据表 set 字段="赋值" where 关健字段="字段值";

在这里关健字段是唯一的,这样才能找到你所要更新的纪录,表达不太好;如果不太熟悉,慢慢理解吧;我也不会MySQL;呵,难为人师...... 在这里,我们还是把userid 做为关健字段,因为只有这个字段才是唯一的;

再比如,我们想更新用户的家目录,比如我想把test用户的家目录改到 /opt/test;

mysql> select userid,homedir from ftpusers where userid="test";
+--------+-----------+
| userid | homedir |
+--------+-----------+
| test | /home/test |
+--------+-----------+

通过上面的,我们得知test目前的家目录在/home/test,下面我们来更改到/opt/test;

mysql> update ftpusers set homedir="/opt/test" where userid="test";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select userid,homedir from ftpusers where userid="test";
+--------+-----------+
| userid | homedir |
+--------+-----------+
| test | /opt/test |
+--------+-----------+

7.3 ProFTPD 用户磁盘限额管理;

我们在前面所导入的proftpd 数据库中,有这样一段;

CREATE TABLE `quotalimits` (
  `name` varchar(30) default NULL,
  `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  `per_session` enum('false','true') NOT NULL default 'false',
  `limit_type` enum('soft','hard') NOT NULL default 'soft',
  `bytes_in_avail` float NOT NULL default '0',
  `bytes_out_avail` float NOT NULL default '0',
  `bytes_xfer_avail` float NOT NULL default '0',
  `files_in_avail` int(10) unsigned NOT NULL default '0',
  `files_out_avail` int(10) unsigned NOT NULL default '0',
  `files_xfer_avail` int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

说明:

上面其实就是在proftpd库中创建一个表quotalimits;我们在proftpd的数据库中,再来查看一下quotalimits表的结构,这样方便我们理解和使用磁盘限额;

mysql> DESCRIBE quotalimits;
+------------------+------------------------------------+------+-----+---------+-------+
| Field            | Type                               | Null | Key | Default | Extra |
+------------------+------------------------------------+------+-----+---------+-------+
| name             | varchar(30)                        | YES  |     | NULL    |       |
| quota_type       | enum('user','group','class','all') |      |     | user    |       |
| per_session      | enum('false','true')               |      |     | false   |       |
| limit_type       | enum('soft','hard')                |      |     | soft    |       |
| bytes_in_avail   | float                              |      |     | 0       |       |
| bytes_out_avail  | float                              |      |     | 0       |       |
| bytes_xfer_avail | float                              |      |     | 0       |       |
| files_in_avail   | int(10) unsigned                   |      |     | 0       |       |
| files_out_avail  | int(10) unsigned                   |      |     | 0       |       |
| files_xfer_avail | int(10) unsigned                   |      |     | 0       |       |
+------------------+------------------------------------+------+-----+---------+-------+

说明;

quotalimits
     name - username
     quota_type - user, group, class, all (we use user)
     per_session - true or false (we use false)
     limit_type - quota limit type - hard or soft (we use soft)
     bytes_in_avail - upload limit in bytes - allowed bytes on disk (eg diskquota)
     bytes_out_avail - download limit in bytes - allowed bytes a user can download
     bytes_xfer_avail - allowed bytes a user can transfer in/out
     files_in_avail - upload limit in files - allowed number of uploaded files
     files_out_avail - allowed number of downloaded files
     files_xfer_avail - allowed number of files a user can transfer in/out

name 应该这样理解,既能表示单个用户,也能表示用户组名;如果我们在quota_type(限额类型)中使用group来认证的话,那就得在这里设置组名,这样整组都具有统一的磁盘限额的特性;当然您要在ftpgroups表中插入组纪录;并且在member字段中得把用户一个一个的列进去,这是后话了;先自己研究一下,只是插入纪录的事;我们只说最简单的单个用户的磁盘限额;默认值可以为空NULL,如果为空则针对所在有quota_type中设置的类型,比如在quota_type中设置为user ,就是针对所有ftpusers 中的用户起作用;如果是group名,也是对ftpgroups 所有组作用;

quota_type 磁盘限额类型,可以设置为用户,也可以设置为用户组group ;如果您的name写的是用户组,那在这里就得设置为group来认定;默认为user认证;

per_session 默认为false;
limit_type 默认为soft;
bytes_in_avail 用户占用空间大小,也就是家目录的空间最大可以让用户占用多少,单位是byte;默认为0,0是不受限制,以下同理;

bytes_out_avail 注;所有下载文件的总和,默认为0;

bytes_xfer_avail 注;一个用户上传下载流量总和,默认为0

files_in_avail 注:限制上传文件总数,默认为0;

files_out_avail 注;限制下载文件个数总计,默认为0

files_xfer_avail 注:允许下载和上传的文件总和我,默认为0;

由此看来,我们比如想让test用户,约束空间大小为100M,其它不受限制;则可用下面的mysql命令添加;

先让我们对照quotalimits表的结构,然后根据表的结构来添加;

mysql> describe quotalimits;
+------------------+------------------------------------+------+-----+---------+-------+
| Field            | Type                               | Null | Key | Default | Extra |

+------------------+------------------------------------+------+-----+---------+-------+
| name             | varchar(30)                        | YES  |     | NULL    |       |
| quota_type       | enum('user','group','class','all') |      |     | user    |       |
| per_session      | enum('false','true')               |      |     | false   |       |
| limit_type       | enum('soft','hard')                |      |     | soft    |       |
| bytes_in_avail   | float                              |      |     | 0       |       |
| bytes_out_avail  | float                              |      |     | 0       |       |
| bytes_xfer_avail | float                              |      |     | 0       |       |
| files_in_avail   | int(10) unsigned                   |      |     | 0       |       |
| files_out_avail  | int(10) unsigned                   |      |     | 0       |       |
| files_xfer_avail | int(10) unsigned                   |      |     | 0       |       |
+------------------+------------------------------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

添加记录

mysql>insert into quotalimits VALUES ('test','user','false','soft','104857600','0','0','0','0','0');

运算公式:

1Kb=1024 byte
1M=1024 Kb
100M=100x1024 Kb= 100x1024x1024 byte=104857600 byte

注意:磁盘限额生效,必须让FTP用户重新登录才有效;比如test用户正在ftp上,这时要先退出,然后再登录,这是磁盘限额就有效了;

查看用户空间使用情况

登录FTP后用下面的命令;

quote site quota;

举例:

lftp test@192.168.1.5:/> quote site quota;
200-The current quota for this session are [current/limit]:
 Name: test
 Quota Type: User
 Per Session: False
 Limit Type: Soft
   Uploaded Mb: 19.00/95.37
   Downloaded Mb: unlimited
   Transferred Mb: unlimited
   Uploaded files: unlimited
   Downloaded files: unlimited
   Transferred files: unlimited
200 Please contact xxxxx@xxxxxxxxxxx.com if these entries are inaccurate



 

8、本文未尽事宜;


9、关于本文


10、参考文档

Mandrake 10.1 - Proftpd + MySQL authentication + Quotas Howto

11、相关文档

上一页 [1] [2] [3] 4
  • 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
  • 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
更多
留言建议ASP探针PHP探针站长Enjoy的Blog
© 2017 T086学习网 - T086.com(原itlearner.com)
RunTime:10.02ms QueryTime:7