ProFTPD支援MySQL新增虛擬使用者認證及磁碟限額(轉)
ProFTPD支援MySQL新增虛擬使用者認證及磁碟限額(轉)[@more@]前言
本文是根據實踐而來,最主要是幫助新手知道怎麼自架FTP伺服器,本文也可以說是一個簡單的使用例子;但不會把ProFTPD的所有文件都詳細說明;也就是說簡單的安裝和配置,以及最簡單的使用。讓不懂ProFTPD的弟兄,比著“瓢”也能畫出“葫蘆”。至於哪個FTP伺服器程式更好,我想都是好的,只要會用就行;vsftpd 現在很流行;但ProFTPD也是一種選擇... ...
1、什麼是ProFTPD;
ProFTPD 是一個FTP伺服器程式,和vsftpd、wuftp 類似的FTP伺服器,他們最終實現功能和目的都是一樣的,都是為了傳輸檔案;
2、ProFTPD的編譯和安裝;
2.1、ProFTPD的下載;
ProFTPD的主頁:
本教程選用版本: proftpd-1.3.0rc3.tar.gz
下載地址:
2.2、編譯安裝;
編譯安裝時得用編譯環境,比如需要gcc,如果少什麼包,您可以在系統安裝盤中找到;或者線上升級也行;現在大多的發行版都有支援線上升級的軟體包管理工具;比如RPM的系統有yum和apt可用,debian有apt可用 ... ... 另外Proftpd 的使用者認證是透過MySQL資料庫來實現的,我們也得把Mysql資料庫伺服器也得安裝上吧;這個不詳細說了,您自己看著辦吧;
我們想把ProFTPD 安裝在 /opt/proftpd 目錄中,我們把軟體下載到 root使用者的家目錄中,因為安裝軟體需要 root許可權,如果您在普通使用者下執行編譯是,到make install 這步,得透過su命令切換到root使用者,然後執行 make install ;
[root@localhost ~]# pwd
/root
[root@localhost ~]# ls
proftpd-1.3.0rc3.tar.gz
解壓、編譯、安裝
[root@localhost ~]# tar zxvf proftpd-1.3.0rc3.tar.gz
[root@localhost ~]# cd proftpd-1.3.0rc3
[root@localhost proftpd-1.3.0rc3]#./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
--with-includes=/usr/include/mysql
--with-libraries=/usr/lib/mysql
--prefix=/opt/proftpd
說明:
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
這句是讓編譯ProFTPD 支援MySQL的模組,並有磁碟限額支援;
--with-includes=
這是來指定MySQL伺服器includes所在的位置;在這裡我設定的是/usr/include/mysql,因為我的MySQL伺服器的includes的確在這個目錄;你可以根據自己的機器環境來調整;
--with-libraries=
這是來指定MySQL伺服器libraries所在的位置;在這裡我設定的是/usr/lib/mysql,因為我的MySQL伺服器的libraries的確在這個目錄;你可以根據自己的機器環境來調整;
--prefix=
這是用來指定要把ProFTPD安裝在哪個位置,在這裡我把ProFTPD安裝在了 /opt/proftpd 目錄下,您不必自己建目錄 /opt/proftpd ,在安裝的時候這個目錄會自動生成;當然您也可以自己來指定ProFTPD的安裝位置;當我們不需要proftpd的時候,就可以直接刪除proftpd目錄;這樣做好象是有點方便;
在configure過程中的錯誤排查:
如果在configure過程中,也就是上面的./configure 一長串指令執行後,有錯誤發生,無非是編譯工具缺少或者Mysql的includes和libraries的目錄指定的不對;自己想想看?
編譯和安裝:
[root@localhost proftpd-1.3.0rc3]# make
[root@localhost proftpd-1.3.0rc3]# make install
如果沒有錯誤發生,這樣就安裝好了,您可以在 /opt/目錄下看到一個/opt/proftpd 的目錄;
[root@localhost proftpd-1.3.0rc3]# ls -ld /opt/proftpd/
drwxr-xr-x 8 root root 4096 1月 2 09:37 /opt/proftpd
3、ProFTPD認證中的MySQL資料庫
3.1、建立一個ProFTPD的資料庫proftpd;
首先您應該會把MySQL資料庫伺服器開啟,以MySQL的超級管理員root進入建立名為proftpd的資料庫;
[root@localhost ~]# mysql -uroot -p
Enter password: 注:在這裡請您輸入MySQL的管理密碼;
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 41 to server version: 4.1.11
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>create database proftpd;
mysql>Grant select,insert,update,delete,create,drop,index,alter,create temporary tables,lock tables on proftpd.* to proftpd@localhost Identified by "123456";
mysql>quit
說明:
create database proftpd; 這行是建立名為proftpd的資料庫;
Grant 這行是為proftpd 資料庫授權,讓使用者名稱為proftpd,密碼為123456(這只是一個例子,密碼自己定義),這個用來管理proftpd這個資料庫;
quit 這行是退出mysql介面;
3.2、匯入proftpd資料庫;
下面是一個現成的資料庫,你只需要匯入就行了,比較簡單;把下面的程式碼複製下來,然後另存為 proftpd.sql;然後透過下面的命令來匯入;
[root@localhost ~]# mysql -uproftpd -p proftpd Enter password: 在這裡輸入proftpd 資料庫管理員proftpd 的密碼,我們前面舉例是123456,以你設定的為準;
下面是proftpd的資料庫,您可以複製下來,另存為 proftpd.sql ,然後用上面的命令來匯入;
-- 資料庫: `proftpd`
--
-- --------------------------------------------------------
--
-- 表的結構 `ftpgroups`
--
CREATE TABLE `ftpgroups` (
`groupname` varchar(30) NOT NULL default '',
`gid` int(11) NOT NULL default '1000',
`members` varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- 表的結構 `ftpusers`
--
CREATE TABLE `ftpusers` (
`userid` varchar(30) NOT NULL default '',
`passwd` varchar(80) NOT NULL default '',
`uid` int(10) unsigned NOT NULL default '1000',
`gid` int(10) unsigned NOT NULL default '1000',
`homedir` varchar(255) NOT NULL default '',
`shell` varchar(255) NOT NULL default '/sbin/nologin',
`count` int(10) unsigned NOT NULL default '0',
`host` varchar(30) NOT NULL default '',
`lastlogin` varchar(30) NOT NULL default '',
UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- 匯出表中的資料 `ftpusers`
--
INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');
-- --------------------------------------------------------
--
-- 表的結構 `quotalimits`
--
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;
-- --------------------------------------------------------
--
-- 表的結構 `quotatallies`
--
CREATE TABLE `quotatallies` (
`name` varchar(30) NOT NULL default '',
`quota_type` enum('user','group','class','all') NOT NULL default 'user',
`bytes_in_used` float NOT NULL default '0',
`bytes_out_used` float NOT NULL default '0',
`bytes_xfer_used` float NOT NULL default '0',
`files_in_used` int(10) unsigned NOT NULL default '0',
`files_out_used` int(10) unsigned NOT NULL default '0',
`files_xfer_used` int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
4、ProFTPD的配置檔案proftpd.conf
在我們這個例子中,ProFTPD的配置檔案在/opt/proftpd/etc目錄中,就是proftpd.conf檔案;您可以把它改名備份;
[root@localhost ~]# cd /opt/proftpd/etc/
[root@localhost etc]# mv proftpd.conf proftpd.confBAK
然後再新建一個 proftpd.conf 檔案,內容如下;您可以對這個檔案進行相應的調整;其中#號部份就是注掉的,不會生效;注意一下MySQL連線資料庫部份;另外如果您不是把ProFTPD安裝在了/opt/proftpd目錄下,一些東西也是需要調整的;自己看著辦吧;
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerName "My TestFTP" #這是您的FTP伺服器的名字,自己寫定
ServerType standalone
ServerAdmin #這是管理員信箱,自己來寫;
DefaultServer On
# Display message
DisplayLogin /opt/proftpd/etc/ftplogin.msg
#DisplayConnect /net/messages/ftp.pre
#DisplayFirstChdir index.txt
# Port 21 is the standard FTP port.
Port 21
# Limit users to login by username
AllowAll
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# Limit login attempts
#
MaxLoginAttempts 5
# Set the maximum number of seconds a data connection is allowed
# to "stall" before being aborted.
TimeoutStalled 600
TimeoutLogin 900
TimeoutIdle 600
TimeoutNoTransfer 600
# Set the user and group under which the server will run.
User nobody
Group nobody
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Users needs a valid shell
#
RequireValidShell off
# Performance: skip DNS resolution when we process the logs...
UseReverseDNS off
# Turn off Ident lookups
IdentLookups off
# Restart session support
#
AllowStoreRestart on
AllowRetrieveRestart on
#-------- load sql.mod for mysql authoritative --------#
SQLConnectInfo proftpd@localhost proftpd 123456
#注:上面這行是MySQL連線伺服器部份,自己根據情況來改一改;
SQLAuthTypes Plaintext
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups
SQLNegativeCache on
SQLHomedirOnDemand on
SQLLogFile /var/log/proftpd.sql.log
SQLNamedQuery getcount SELECT "count from ftpusers where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpusers where userid='%u'"
SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpusers
SQLShowInfo PASS "230" "You've logged on %{getcount} times, last login at %{getlastlogin}"
SQLLog PASS updatelogininfo
#-------- load sql.mod for mysql authoritative --------#
#--------- load qudes.mod for Quota limit --------#
QuotaDirectoryTally on
QuotaDisplayUnits "Mb"
QuotaEngine on
#QuotaLog /var/log/proftpd.quota.log
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail,
bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used,
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0},
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2},
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4},
files_xfer_used = files_xfer_used + %{5}
WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
#--------- load qudes.mod for Quota limit --------#
# Logging options
# Debug Level
# emerg, alert, crit (empfohlen), error, warn. notice, info, debug
#
SyslogLevel emerg
SystemLog /var/log/proftpd.system.log
TransferLog /var/log/proftpd.xferlog
# Some logging formats
#
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
# Log file/dir access
# ExtendedLog /var/log/proftpd.access_log WRITE,READ write
# Record all logins
ExtendedLog /var/log/proftpd.auth_log AUTH auth
# Paranoia logging level....
ExtendedLog /var/log/proftpd.paranoid_log ALL default
#注;上面幾行是存放log的設定,不必改動也行;檢視log就到上面相應的檔案看吧;
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30 #注最多30個ip同時登入使用ftp;
# Maximum clients with message
#MaxClients 2 "Sorry, max %m users -- try again later"
MaxClientsPerHost 2 "Sorry, only 2 session for one host"
#注每個ip,只能兩個執行緒程,請自己調整;
# Normally, we want files to be overwriteable.
AllowOverwrite on
RootLogin off
RequireValidShell off
# alphanumeric characters for uploads (and not shell code...)
#PathAllowFilter "^[a-zA-Z0-9_.-]()'+$"
#PathAllowFilter "^[a-zA-Z0-9 _.-]()'+$"
# We don't want .ftpaccess or .htaccess files to be uploaded
#PathDenyFilter "(.ftp)|(.ht)[a-z]+$"
#pathDenyFilter ".ftp[a-z]+$"
# Do not allow to pass printf-Formats (security! see documentation!):
#AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
#DenyFilter "%"
5、系統使用者和使用者組ftp的UID和GID的調整;
由於我們在配置檔案中,把ftp的使用者和使用者組的UID和GID都設定為了1000;所以我們得調整一下/etc/passwd 和/etc/group中有關ftp使用者和使用者組的行;把UID和GID都改為1000;
您可以在/etc/passwd 中找到 ftp使用者一行,比如類似下面這行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
在這行中,14是ftp使用者的UID,我們要改為1000,50為ftp使用者組的GID,也改為1000,其它的可以不變;也就是
ftp:x:1000:1000:FTP User:/var/ftp:/sbin/nologin
接著我們再找到 /etc/group ;在這個檔案中找到一行,類似如下的;
ftp:x:50:
把這行中的50改為1000;也就是這樣的;
ftp:x:1000:
6、啟動ProFTPD,並測試;
[root@localhost ~]# /opt/proftpd/sbin/proftpd
[root@localhost ~]# pgrep proftpd
17965
說明:上面就把proftpd 啟動起來了;我們透過pgrep 來檢視是否有ProFTPD的程式,檢視得知已經有了;證明伺服器已經啟動。我們進入測試階段;
測試:測試帳號是test,密碼是test;您可以用ftp命令來測試,也可以用lftp來測試,也可以用gftp來測試;找一個FTP客戶端就行;這個test帳號是怎麼來的呢。回頭看一下proftpd.sql那段程式碼中,是否有下面這行;
INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');
這是我在寫文件時,新增的一個測試帳號;只要您把proftpd.sql檔案匯入了,就有這個帳號;您當然也可以刪除它;上面這行說的是在ftpusers的表中,新增一個錄;也就是ftp使用者的記錄;在本文的最下面有說明如何透過MySQL來管理帳號;在這裡我們只是測試是不是FTP能用了;
在預設的情況下,test使用者的家目錄是在/home/test,密碼是test;而/home/test是當您第一次以使用者test登入時,系統自動建立的;這些都自動的;
如果您用ftp命令連線
[root@localhost home]# ftp localhost
Connected to localhost.localdomain.
220 ProFTPD 1.3.0rc3 Server (My TestFTP) [127.0.0.1]
500 AUTH not understood
500 AUTH not understood
KERBEROS_V4 rejected as an authentication type
Name (localhost:beinan): test 注:使用者名稱
331 Password required for test. 注:密碼
Password:
230-You've logged on 5 times, last login at 2006-01-02 12:50:27
230 User test logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls 注:ls 檢視;
227 Entering Passive Mode (127,0,0,1,128,31).
150 Opening ASCII mode data connection for file list
226 Transfer complete.
ftp> mkdir mytestdir 注:建立目錄看是否成功;
257 "/mytestdir" - Directory successfully created
ftp> dir 注:檢視是否有mytestdir 目錄;
227 Entering Passive Mode (127,0,0,1,128,32).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 test ftp 4096 Jan 2 04:53 mytestdir
226 Transfer complete.
ftp>
如果您用lftp 來連線測試
[root@localhost home]# lftp test:test@localhost 注:登入;
lftp test@localhost:~> ls 注:列目錄;
lftp test@localhost:/> put /home/beinan/fcitx-3.2-051108.tar.bz2
4164490 bytes transferred 注:上傳測試;
lftp test@localhost:/> ls 注:檢視是否成功;OK成功
-rw-r--r-- 1 test ftp 4164490 Jan 2 05:03 fcitx-3.2-051108.tar.bz2
說明:
如果您想遠端連線,請把localhost改為實際ip地址,比如我的機器在本地網是192.168.1.5,那就把localhost改為192.168.1.5;如果您想在公網測試,請把localhost改為公網的IP地址;
請檢視是否有/home/test這個目錄 ?是不是FTP伺服器自己建了一個?答案是肯定的... ...
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 if these entries are inaccurate
本文是根據實踐而來,最主要是幫助新手知道怎麼自架FTP伺服器,本文也可以說是一個簡單的使用例子;但不會把ProFTPD的所有文件都詳細說明;也就是說簡單的安裝和配置,以及最簡單的使用。讓不懂ProFTPD的弟兄,比著“瓢”也能畫出“葫蘆”。至於哪個FTP伺服器程式更好,我想都是好的,只要會用就行;vsftpd 現在很流行;但ProFTPD也是一種選擇... ...
1、什麼是ProFTPD;
ProFTPD 是一個FTP伺服器程式,和vsftpd、wuftp 類似的FTP伺服器,他們最終實現功能和目的都是一樣的,都是為了傳輸檔案;
2、ProFTPD的編譯和安裝;
2.1、ProFTPD的下載;
ProFTPD的主頁:
本教程選用版本: proftpd-1.3.0rc3.tar.gz
下載地址:
2.2、編譯安裝;
編譯安裝時得用編譯環境,比如需要gcc,如果少什麼包,您可以在系統安裝盤中找到;或者線上升級也行;現在大多的發行版都有支援線上升級的軟體包管理工具;比如RPM的系統有yum和apt可用,debian有apt可用 ... ... 另外Proftpd 的使用者認證是透過MySQL資料庫來實現的,我們也得把Mysql資料庫伺服器也得安裝上吧;這個不詳細說了,您自己看著辦吧;
我們想把ProFTPD 安裝在 /opt/proftpd 目錄中,我們把軟體下載到 root使用者的家目錄中,因為安裝軟體需要 root許可權,如果您在普通使用者下執行編譯是,到make install 這步,得透過su命令切換到root使用者,然後執行 make install ;
[root@localhost ~]# pwd
/root
[root@localhost ~]# ls
proftpd-1.3.0rc3.tar.gz
解壓、編譯、安裝
[root@localhost ~]# tar zxvf proftpd-1.3.0rc3.tar.gz
[root@localhost ~]# cd proftpd-1.3.0rc3
[root@localhost proftpd-1.3.0rc3]#./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
--with-includes=/usr/include/mysql
--with-libraries=/usr/lib/mysql
--prefix=/opt/proftpd
說明:
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
這句是讓編譯ProFTPD 支援MySQL的模組,並有磁碟限額支援;
--with-includes=
這是來指定MySQL伺服器includes所在的位置;在這裡我設定的是/usr/include/mysql,因為我的MySQL伺服器的includes的確在這個目錄;你可以根據自己的機器環境來調整;
--with-libraries=
這是來指定MySQL伺服器libraries所在的位置;在這裡我設定的是/usr/lib/mysql,因為我的MySQL伺服器的libraries的確在這個目錄;你可以根據自己的機器環境來調整;
--prefix=
這是用來指定要把ProFTPD安裝在哪個位置,在這裡我把ProFTPD安裝在了 /opt/proftpd 目錄下,您不必自己建目錄 /opt/proftpd ,在安裝的時候這個目錄會自動生成;當然您也可以自己來指定ProFTPD的安裝位置;當我們不需要proftpd的時候,就可以直接刪除proftpd目錄;這樣做好象是有點方便;
在configure過程中的錯誤排查:
如果在configure過程中,也就是上面的./configure 一長串指令執行後,有錯誤發生,無非是編譯工具缺少或者Mysql的includes和libraries的目錄指定的不對;自己想想看?
編譯和安裝:
[root@localhost proftpd-1.3.0rc3]# make
[root@localhost proftpd-1.3.0rc3]# make install
如果沒有錯誤發生,這樣就安裝好了,您可以在 /opt/目錄下看到一個/opt/proftpd 的目錄;
[root@localhost proftpd-1.3.0rc3]# ls -ld /opt/proftpd/
drwxr-xr-x 8 root root 4096 1月 2 09:37 /opt/proftpd
3、ProFTPD認證中的MySQL資料庫
3.1、建立一個ProFTPD的資料庫proftpd;
首先您應該會把MySQL資料庫伺服器開啟,以MySQL的超級管理員root進入建立名為proftpd的資料庫;
[root@localhost ~]# mysql -uroot -p
Enter password: 注:在這裡請您輸入MySQL的管理密碼;
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 41 to server version: 4.1.11
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>create database proftpd;
mysql>Grant select,insert,update,delete,create,drop,index,alter,create temporary tables,lock tables on proftpd.* to proftpd@localhost Identified by "123456";
mysql>quit
說明:
create database proftpd; 這行是建立名為proftpd的資料庫;
Grant 這行是為proftpd 資料庫授權,讓使用者名稱為proftpd,密碼為123456(這只是一個例子,密碼自己定義),這個用來管理proftpd這個資料庫;
quit 這行是退出mysql介面;
3.2、匯入proftpd資料庫;
下面是一個現成的資料庫,你只需要匯入就行了,比較簡單;把下面的程式碼複製下來,然後另存為 proftpd.sql;然後透過下面的命令來匯入;
[root@localhost ~]# mysql -uproftpd -p proftpd
下面是proftpd的資料庫,您可以複製下來,另存為 proftpd.sql ,然後用上面的命令來匯入;
-- 資料庫: `proftpd`
--
-- --------------------------------------------------------
--
-- 表的結構 `ftpgroups`
--
CREATE TABLE `ftpgroups` (
`groupname` varchar(30) NOT NULL default '',
`gid` int(11) NOT NULL default '1000',
`members` varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- 表的結構 `ftpusers`
--
CREATE TABLE `ftpusers` (
`userid` varchar(30) NOT NULL default '',
`passwd` varchar(80) NOT NULL default '',
`uid` int(10) unsigned NOT NULL default '1000',
`gid` int(10) unsigned NOT NULL default '1000',
`homedir` varchar(255) NOT NULL default '',
`shell` varchar(255) NOT NULL default '/sbin/nologin',
`count` int(10) unsigned NOT NULL default '0',
`host` varchar(30) NOT NULL default '',
`lastlogin` varchar(30) NOT NULL default '',
UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- 匯出表中的資料 `ftpusers`
--
INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');
-- --------------------------------------------------------
--
-- 表的結構 `quotalimits`
--
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;
-- --------------------------------------------------------
--
-- 表的結構 `quotatallies`
--
CREATE TABLE `quotatallies` (
`name` varchar(30) NOT NULL default '',
`quota_type` enum('user','group','class','all') NOT NULL default 'user',
`bytes_in_used` float NOT NULL default '0',
`bytes_out_used` float NOT NULL default '0',
`bytes_xfer_used` float NOT NULL default '0',
`files_in_used` int(10) unsigned NOT NULL default '0',
`files_out_used` int(10) unsigned NOT NULL default '0',
`files_xfer_used` int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
4、ProFTPD的配置檔案proftpd.conf
在我們這個例子中,ProFTPD的配置檔案在/opt/proftpd/etc目錄中,就是proftpd.conf檔案;您可以把它改名備份;
[root@localhost ~]# cd /opt/proftpd/etc/
[root@localhost etc]# mv proftpd.conf proftpd.confBAK
然後再新建一個 proftpd.conf 檔案,內容如下;您可以對這個檔案進行相應的調整;其中#號部份就是注掉的,不會生效;注意一下MySQL連線資料庫部份;另外如果您不是把ProFTPD安裝在了/opt/proftpd目錄下,一些東西也是需要調整的;自己看著辦吧;
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerName "My TestFTP" #這是您的FTP伺服器的名字,自己寫定
ServerType standalone
ServerAdmin #這是管理員信箱,自己來寫;
DefaultServer On
# Display message
DisplayLogin /opt/proftpd/etc/ftplogin.msg
#DisplayConnect /net/messages/ftp.pre
#DisplayFirstChdir index.txt
# Port 21 is the standard FTP port.
Port 21
# Limit users to login by username
AllowAll
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# Limit login attempts
#
MaxLoginAttempts 5
# Set the maximum number of seconds a data connection is allowed
# to "stall" before being aborted.
TimeoutStalled 600
TimeoutLogin 900
TimeoutIdle 600
TimeoutNoTransfer 600
# Set the user and group under which the server will run.
User nobody
Group nobody
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Users needs a valid shell
#
RequireValidShell off
# Performance: skip DNS resolution when we process the logs...
UseReverseDNS off
# Turn off Ident lookups
IdentLookups off
# Restart session support
#
AllowStoreRestart on
AllowRetrieveRestart on
#-------- load sql.mod for mysql authoritative --------#
SQLConnectInfo proftpd@localhost proftpd 123456
#注:上面這行是MySQL連線伺服器部份,自己根據情況來改一改;
SQLAuthTypes Plaintext
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups
SQLNegativeCache on
SQLHomedirOnDemand on
SQLLogFile /var/log/proftpd.sql.log
SQLNamedQuery getcount SELECT "count from ftpusers where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpusers where userid='%u'"
SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpusers
SQLShowInfo PASS "230" "You've logged on %{getcount} times, last login at %{getlastlogin}"
SQLLog PASS updatelogininfo
#-------- load sql.mod for mysql authoritative --------#
#--------- load qudes.mod for Quota limit --------#
QuotaDirectoryTally on
QuotaDisplayUnits "Mb"
QuotaEngine on
#QuotaLog /var/log/proftpd.quota.log
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail,
bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used,
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0},
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2},
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4},
files_xfer_used = files_xfer_used + %{5}
WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
#--------- load qudes.mod for Quota limit --------#
# Logging options
# Debug Level
# emerg, alert, crit (empfohlen), error, warn. notice, info, debug
#
SyslogLevel emerg
SystemLog /var/log/proftpd.system.log
TransferLog /var/log/proftpd.xferlog
# Some logging formats
#
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
# Log file/dir access
# ExtendedLog /var/log/proftpd.access_log WRITE,READ write
# Record all logins
ExtendedLog /var/log/proftpd.auth_log AUTH auth
# Paranoia logging level....
ExtendedLog /var/log/proftpd.paranoid_log ALL default
#注;上面幾行是存放log的設定,不必改動也行;檢視log就到上面相應的檔案看吧;
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30 #注最多30個ip同時登入使用ftp;
# Maximum clients with message
#MaxClients 2 "Sorry, max %m users -- try again later"
MaxClientsPerHost 2 "Sorry, only 2 session for one host"
#注每個ip,只能兩個執行緒程,請自己調整;
# Normally, we want files to be overwriteable.
AllowOverwrite on
RootLogin off
RequireValidShell off
# alphanumeric characters for uploads (and not shell code...)
#PathAllowFilter "^[a-zA-Z0-9_.-]()'+$"
#PathAllowFilter "^[a-zA-Z0-9 _.-]()'+$"
# We don't want .ftpaccess or .htaccess files to be uploaded
#PathDenyFilter "(.ftp)|(.ht)[a-z]+$"
#pathDenyFilter ".ftp[a-z]+$"
# Do not allow to pass printf-Formats (security! see documentation!):
#AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
#DenyFilter "%"
5、系統使用者和使用者組ftp的UID和GID的調整;
由於我們在配置檔案中,把ftp的使用者和使用者組的UID和GID都設定為了1000;所以我們得調整一下/etc/passwd 和/etc/group中有關ftp使用者和使用者組的行;把UID和GID都改為1000;
您可以在/etc/passwd 中找到 ftp使用者一行,比如類似下面這行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
在這行中,14是ftp使用者的UID,我們要改為1000,50為ftp使用者組的GID,也改為1000,其它的可以不變;也就是
ftp:x:1000:1000:FTP User:/var/ftp:/sbin/nologin
接著我們再找到 /etc/group ;在這個檔案中找到一行,類似如下的;
ftp:x:50:
把這行中的50改為1000;也就是這樣的;
ftp:x:1000:
6、啟動ProFTPD,並測試;
[root@localhost ~]# /opt/proftpd/sbin/proftpd
[root@localhost ~]# pgrep proftpd
17965
說明:上面就把proftpd 啟動起來了;我們透過pgrep 來檢視是否有ProFTPD的程式,檢視得知已經有了;證明伺服器已經啟動。我們進入測試階段;
測試:測試帳號是test,密碼是test;您可以用ftp命令來測試,也可以用lftp來測試,也可以用gftp來測試;找一個FTP客戶端就行;這個test帳號是怎麼來的呢。回頭看一下proftpd.sql那段程式碼中,是否有下面這行;
INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');
這是我在寫文件時,新增的一個測試帳號;只要您把proftpd.sql檔案匯入了,就有這個帳號;您當然也可以刪除它;上面這行說的是在ftpusers的表中,新增一個錄;也就是ftp使用者的記錄;在本文的最下面有說明如何透過MySQL來管理帳號;在這裡我們只是測試是不是FTP能用了;
在預設的情況下,test使用者的家目錄是在/home/test,密碼是test;而/home/test是當您第一次以使用者test登入時,系統自動建立的;這些都自動的;
如果您用ftp命令連線
[root@localhost home]# ftp localhost
Connected to localhost.localdomain.
220 ProFTPD 1.3.0rc3 Server (My TestFTP) [127.0.0.1]
500 AUTH not understood
500 AUTH not understood
KERBEROS_V4 rejected as an authentication type
Name (localhost:beinan): test 注:使用者名稱
331 Password required for test. 注:密碼
Password:
230-You've logged on 5 times, last login at 2006-01-02 12:50:27
230 User test logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls 注:ls 檢視;
227 Entering Passive Mode (127,0,0,1,128,31).
150 Opening ASCII mode data connection for file list
226 Transfer complete.
ftp> mkdir mytestdir 注:建立目錄看是否成功;
257 "/mytestdir" - Directory successfully created
ftp> dir 注:檢視是否有mytestdir 目錄;
227 Entering Passive Mode (127,0,0,1,128,32).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 test ftp 4096 Jan 2 04:53 mytestdir
226 Transfer complete.
ftp>
如果您用lftp 來連線測試
[root@localhost home]# lftp test:test@localhost 注:登入;
lftp test@localhost:~> ls 注:列目錄;
lftp test@localhost:/> put /home/beinan/fcitx-3.2-051108.tar.bz2
4164490 bytes transferred 注:上傳測試;
lftp test@localhost:/> ls 注:檢視是否成功;OK成功
-rw-r--r-- 1 test ftp 4164490 Jan 2 05:03 fcitx-3.2-051108.tar.bz2
說明:
如果您想遠端連線,請把localhost改為實際ip地址,比如我的機器在本地網是192.168.1.5,那就把localhost改為192.168.1.5;如果您想在公網測試,請把localhost改為公網的IP地址;
請檢視是否有/home/test這個目錄 ?是不是FTP伺服器自己建了一個?答案是肯定的... ...
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 if these entries are inaccurate
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-945779/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VM虛擬機器 linux系統新增磁碟虛擬機Linux
- Linux中Postfix虛擬使用者及虛擬域(六)Linux
- 為Kubernetes叢集新增使用者認證
- docker desktop清理wsl虛擬磁碟Docker
- LVM與磁碟配額(包含磁碟配額與驗證實操)LVM
- win10系統怎麼建立虛擬磁碟_win10新建虛擬磁碟的方法Win10
- MySQL虛擬列MySql
- 虛擬機器磁碟擴容parted虛擬機
- 使用Proftpd支援FTP/SFTP許可權管控FTP
- [譯] 認識虛擬 DOM
- Nginx 新增 Auth Basic 認證Nginx
- MySql新增使用者MySql
- Jupyter notebook 新增虛擬環境
- pycharm新增conda虛擬環境PyCharm
- 虛擬機器磁碟中毒解密恢復虛擬機解密
- Linux虛擬機器擴充套件磁碟Linux虛擬機套件
- 為 Eureka 新增 Http Basic 認證HTTP
- laravel使用者認證Laravel
- mySql 新增新使用者MySql
- mysql 5.7 虛擬列功能MySql
- nginx配置kibana訪問使用者名稱和密碼認證、及無認證訪問配置Nginx密碼
- vsftp vuser虛擬使用者FTP
- Python 外掛虛擬環境支援Python
- 關於os認證和口令檔案認證(轉)
- Laravel 5.1使用者認證Laravel
- Laravel 使用者認證 AuthLaravel
- 公司網路虛擬機器無法進行上網認證問題虛擬機
- VirtualBox擴容CentOS-7虛擬機器磁碟CentOS虛擬機
- Ubuntu 新增虛擬記憶體檔案Ubuntu記憶體
- KVM虛擬機器新增物理網路卡虛擬機
- RedHat虛擬機器打不開磁碟問題如何解決?RedHat虛擬機器打不開磁碟的解決方法Redhat虛擬機
- win10 如何新增虛擬桌面_win10怎麼使用虛擬桌面Win10
- 讓KVM虛擬機器支援console功能虛擬機
- 使用者態程式的虛擬地址如何轉換成實體地址
- Django的使用者認證元件Django元件
- 【Web總結】使用者認證Web
- 【Mongo】mongodb的使用者認證MongoDB
- 06.Django-使用者認證Django
- Jenkins API使用者認證方式JenkinsAPI