<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>后院&#124;kevin’s backyard &#187; ftp</title>
	<atom:link href="http://kevin.9511.net/archives/tag/ftp/feed" rel="self" type="application/rss+xml" />
	<link>http://kevin.9511.net</link>
	<description>立志做一个混事业型男人</description>
	<lastBuildDate>Fri, 30 Apr 2010 16:55:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ProFTPD搭载sqlite3，简单配置轻量级FTP服务器</title>
		<link>http://kevin.9511.net/archives/182.html</link>
		<comments>http://kevin.9511.net/archives/182.html#comments</comments>
		<pubDate>Mon, 20 Apr 2009 16:15:10 +0000</pubDate>
		<dc:creator>kevin</dc:creator>
				<category><![CDATA[技术备案]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[proftpd]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://kevin.9511.net/archives/182.html</guid>
		<description><![CDATA[所谓简单，是因为ProFTPD的一些复杂功能都没有写进来，比如用户磁盘空间配额、上传下载速率限制等。
所谓轻量级，是因为配这个平台，是为了公司内部使用，用户有限。更复杂的配置，日后再说吧:)
网上的很多关于ProFTPD搭载数据库进行管理的文章，大多用的都是MySQL(搜baidu的结果)和PostgreSQL(搜google的结果)，可是单单为了一个公司内部使用的这么一个小平台，使用这么两个重量级的数据库，是在有点杀鸡用牛刀的感觉。对于我的需求，Sqlite这个轻量级的嵌入式数据库，显然是最最合适的选择。在网上跑来跑去找了1个多小时，也没有一篇像样的配置文档，甚至连ProFTPD的官方doc里，提起sqlite也是只言片语。没办法，只有自己对着英文的Howto，自己摸索了。
1，Install Sqlite3 and ProFTPD
下载安装Sqlite3最新版：http://www.sqlite.org/
#tar -zxf sqlite-amalgamation-3.6.13.tar.gz
#cd sqlite-3.6.13/
#./configure
#make
#make install
下载安装ProFTPD最新版：http://www.proftpd.org/
ProFTPD对于数据库的支持，并不是通过linux的PAM方式来实现的
而是内置了模块，这点曾经让我走了很多弯路，TMD居然没有文章提及这点。使用sqlite模块:
#tar -zxf proftpd-1.3.2.tar.gz
#cd proftpd-1.3.2
#./configure &#8211;prefix=/usr/local/proftpd &#8211;with-modules=mod_sql:mod_sql_sqlite
#make
#make install
2，配置ProFTPD
编辑/usr/local/proftpd/etc/proftpd.conf文件，加入下面列出来的这一大坨参数。
这里只说说跟Sqlite3有关的参数，其他比较有用的参数配置说明，满世界都是。完整配置文件放在最后。
其实除了SQLBackend和SQLConnectInfo两个参数之外，剩下的一些参数在配置其他数据库时也会用到
我在配置这些数据库相关参数的时候，走了很多弯路，查了很多文档，记下来也给自己脑子备个份。
#首先来说这俩，定义proftpd以什么身份来运行，跟apache里的是一个意思
#我是习惯了apache定义为www用户和www组，配置proftpd也就这样了
#以什么身份运行，我个人感觉没啥特别意义，关键是虚拟用户对实体用户的映射！
User                    www
Group                   www
#sqlite2跟3差别较大，各软件平台对其支持也是分开来的，比如PHP
#这里就是指明，使用sqlite3
SQLBackend sqlite3
#数据库文件的绝对路径，一定要绝对
SQLConnectInfo /home/www/ftpd.db
#数据库内虚拟用户的密码认证方式
#我认为Backend的意思就是数据库自己的认证方式，比如mysql的password方案
#该方案可以指定多种，使用空格隔开，按照先后，依次try
#下面这句的意思就是“先用sqlite自己的认证方式(我用的明文，其他解决方案没研究)
#如果不行，再使用crypt(3)的方案”，实际配置文件里我只要了一个Backend
SQLAuthTypes [...]]]></description>
			<content:encoded><![CDATA[<p>所谓简单，是因为<a title="Highly configurable GPL-licensed FTP server software " href="http://www.proftpd.org/" target="_blank">ProFTPD</a>的一些复杂功能都没有写进来，比如用户磁盘空间配额、上传下载速率限制等。<br />
所谓轻量级，是因为配这个平台，是为了公司内部使用，用户有限。更复杂的配置，日后再说吧:)</p>
<p>网上的很多关于ProFTPD搭载数据库进行管理的文章，大多用的都是MySQL(搜baidu的结果)和PostgreSQL(搜google的结果)，可是单单为了一个公司内部使用的这么一个小平台，使用这么两个重量级的数据库，是在有点杀鸡用牛刀的感觉。对于我的需求，<a title="a lightweight embeddable database system" href="http://www.sqlite.org" target="_blank">Sqlite</a>这个轻量级的嵌入式数据库，显然是最最合适的选择。在网上跑来跑去找了1个多小时，也没有一篇像样的配置文档，甚至连ProFTPD的官方doc里，提起sqlite也是只言片语。没办法，只有自己对着英文的Howto，自己摸索了。</p>
<p><strong>1，Install Sqlite3 and ProFTPD</strong><br />
下载安装Sqlite3最新版：http://www.sqlite.org/</p>
<blockquote><p>#tar -zxf sqlite-amalgamation-3.6.13.tar.gz<br />
#cd sqlite-3.6.13/<br />
#./configure<br />
#make<br />
#make install</p></blockquote>
<p>下载安装ProFTPD最新版：http://www.proftpd.org/<br />
<span style="color: #ff6600;">ProFTPD对于数据库的支持，并不是通过linux的PAM方式来实现的<br />
而是内置了模块，这点曾经让我走了很多弯路，TMD居然没有文章提及这点。使用sqlite模块:</span></p>
<blockquote><p>#tar -zxf proftpd-1.3.2.tar.gz<br />
#cd proftpd-1.3.2<br />
#./configure &#8211;prefix=/usr/local/proftpd &#8211;with-modules=mod_sql:mod_sql_sqlite<br />
#make<br />
#make install</p></blockquote>
<p><strong>2，配置ProFTPD</strong><br />
编辑/usr/local/proftpd/etc/proftpd.conf文件，加入下面列出来的这一大坨参数。<br />
这里只说说跟Sqlite3有关的参数，其他比较有用的参数配置说明，满世界都是。完整配置文件放在最后。<br />
其实除了SQLBackend和SQLConnectInfo两个参数之外，剩下的一些参数在配置其他数据库时也会用到<br />
我在配置这些数据库相关参数的时候，走了很多弯路，查了很多文档，记下来也给自己脑子备个份。</p>
<blockquote><p>#首先来说这俩，定义proftpd以什么身份来运行，跟apache里的是一个意思<br />
#我是习惯了apache定义为www用户和www组，配置proftpd也就这样了<br />
#以什么身份运行，我个人感觉没啥特别意义，关键是虚拟用户对实体用户的映射！<br />
<span style="color: #ff6600;">User                    www<br />
Group                   www</span><br />
#sqlite2跟3差别较大，各软件平台对其支持也是分开来的，比如PHP<br />
#这里就是指明，使用sqlite3<br />
<span style="color: #ff6600;">SQLBackend sqlite3</span><br />
#数据库文件的绝对路径，一定要绝对<br />
<span style="color: #ff6600;">SQLConnectInfo /home/www/ftpd.db</span><br />
#数据库内虚拟用户的密码认证方式<br />
#我认为Backend的意思就是数据库自己的认证方式，比如mysql的password方案<br />
#该方案可以指定多种，使用空格隔开，按照先后，依次try<br />
#下面这句的意思就是“先用sqlite自己的认证方式(我用的明文，其他解决方案没研究)<br />
#如果不行，再使用crypt(3)的方案”，实际配置文件里我只要了一个Backend<br />
<span style="color: #ff6600;">SQLAuthTypes Backend Crypt</span><br />
#自定义存放用户信息的表和字段<br />
#下面这句的意思就是<br />
#users表 里的 字段：用户名 密码 系统映射uid 系统映射gid 主目录 shell路径<br />
#切记：表和字段的名字可以随便起(跟实际数据库中的表和字段相对应)，但顺序不可乱<br />
#按照我对英文howto的理解，前4个字段名是必须要设置的，后两个如果自己用不上<br />
#必须使用NULL来填补，这样mod_sql模块就不会去检索这俩字段了<br />
<span style="color: #ff6600;">SQLUserInfo users user_name user_passwd uid gid home_dir NULL</span><br />
#如果主目录字段名设置为NULL，那么这里这个就必须要定义<br />
#这个是用来定义那些没有“主目录定义的用户”的主目录，有点绕口:P<br />
<span style="color: #ff6600;">#SQLDefaultHomedir &#8220;/tmp&#8221;</span><br />
#这个参数设置为off的意思，是不让proftpd去检查该FTP用户映射到系统里的用户的shell<br />
#就是说，有没有shell，我都让你登陆。特别是上面的字段，将shell路径这个设置为了NULL<br />
<span style="color: #ff6600;">RequireValidShell off</span><br />
#组信息，没啥意思，就这么放着吧，意思跟上面那个SQLUserInfo一样<br />
#表名 组名 组id 成员<br />
<span style="color: #ff6600;">SQLGroupInfo groups group_name gid members</span><br />
#这里是用户身份认证的程度，只验证user，连带group啥的都验证<br />
#图简单，我这里只验证user这一层<br />
<span style="color: #ff6600;">SQLAuthenticate users</span><br />
#设置ProFTPD允许登陆的最小UID，这个UID是映射到linux系统内实际用户的UID，小于这个值将不允许登陆<br />
#这个值如果不设置，系统默认的是999，在很多国内的文章里，uid和gid都是设置5000多<br />
#所以即使不管这个值，也不会有问题，可是如果你跟我一样，映射用户的uid和gid都小于999了，就要注意它了<br />
#我的www用户的uid和gid都是504，在这里，卡了我有一个多小时，TNND<br />
<span style="color: #ff6600;">SQLMinUserUID 500</span><br />
#这两个的意思，是所有未在数据库中定义uid和gid的用户的默认uid及gid<br />
<span style="color: #ff6600;">SQLDefaultUID 504</span><br />
<span style="color: #ff6600;">SQLDefaultGID 504</span></p></blockquote>
<p>我的完整的proftpd.conf文件</p>
<blockquote><p><a href="http://rui7905.googlecode.com/svn/trunk/proftpd_sqlite3" target="_blank">http://rui7905.googlecode.com/svn/trunk/proftpd_sqlite3</a></p></blockquote>
<p><strong>3，建立数据库及用户表</strong><br />
#sqlite3 /home/www/ftpd.db 数据库就建好了，简单吧~<br />
其实理论上，这个文件的路径，是放在哪里都可以的。我配置完这个平台后，又用php写了一个简单的管理平台<br />
为了方便我的apache运行用户www读写数据库，就放在了www的主目录下。。<br />
在sqlite3环境下，用下面这个语句建立数据表</p>
<blockquote><p>CREATE TABLE &#8220;users&#8221; (&#8221;user_name&#8221; varchar(20), &#8220;user_passwd&#8221; varchar(50), &#8220;uid&#8221; int(11) NOT NULL  DEFAULT 504, &#8220;gid&#8221; int(11) NOT NULL  DEFAULT 504, &#8220;home_dir&#8221; varchar(200), &#8220;shell&#8221; varchar(200))</p></blockquote>
<p>下面创建一个新用户：</p>
<blockquote><p>INSERT INTO &#8220;users&#8221; VALUES(&#8217;test&#8217;,'test&#8217;,504,504,&#8217;/home/www/ftp/test&#8217;,NULL);</p></blockquote>
<p>表的uid和gid的默认值都设置为了504，即www用户在系统内的uid和gid的值。新添加字段时，这两个字段我也设置了。www用户和组在我系统内是早就建好的，uid和gid分别都是504。通过这两个字段的值，就完成了proftpd内的虚拟用户跟系统内实体用户的映射。具体到自己，请根据实际情况来设置这两个字段的默认值，及新添加记录的值。<br />
<strong>4，最后</strong><br />
到现在，整个配置应该是完成了，使用这个命令来启动ProFTPD:</p>
<blockquote><p>/usr/local/proftpd/sbin/proftpd -c /usr/local/proftpd/etc/proftpd.conf &amp;</p></blockquote>
<p>参考资料：<br />
ProFTPD Howto:SQL and mod_sql:<br />
<a title="ProFTPD Howto:SQL and mod_sql" href="http://www.proftpd.org/docs/howto/SQL.html" target="_blank">http://www.proftpd.org/docs/howto/SQL.html</a><br />
ProFTPD module mod_sql:<br />
<a title="ProFTPD module mod_sql" href="http://www.proftpd.org/docs/contrib/mod_sql.html" target="_blank">http://www.proftpd.org/docs/contrib/mod_sql.html</a><br />
ProFTPD module mod_sql_sqlite:<br />
<a title="ProFTPD module mod_sql_sqlite" href="http://www.proftpd.org/docs/contrib/mod_sql_sqlite.html">http://www.proftpd.org/docs/contrib/mod_sql_sqlite.html</a><br />
Configuration Directive List:<br />
<a title="Configuration Directive List" href="http://www.proftpd.org/docs/directives/linked/by-name.html" target="_blank">http://www.proftpd.org/docs/directives/linked/by-name.html</a><br />
Simple MySQL Authentication:<br />
<a title="Simple MySQL Authentication" href="http://www.proftpd.org/docs/configs/mysql_simple.conf" target="_blank">http://www.proftpd.org/docs/configs/mysql_simple.conf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kevin.9511.net/archives/182.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
