|
注:
英文原文为 ProFTPD 1.2.6 源代码根目录下的 INSTALL 文件,
中文翻译原文在 http://jeffwu.51.net/proftpd/INSTALL 。
请各位兄弟们多多指教,共同进步!
ProFTPD 1.2.0 安装指南(中文版)
==============================
吴伟<jeffwu> 327@263.net 2002.10.5
----
介绍
----
ProFTPD 被设计成了能在目标系统上,通过一个单一的名为'configure'的shell脚本来完
成编译的配置任务.该脚本文件位于源代码树的顶层.这个由GNU autoconf 工具创建的脚本
文件将会分析你的系统,创建一个'config.h'文件,使你可以清楚的编译ProFTPD。某些系
统可能需要指定某些选项给'configure'或手工修改由'configure'产生的config.h文件
和Makefile文件
ProFTPD被设计得十分灵活,导致的编译时和运行时的额外的配置复杂性也就是必要的了。
你可以基于命令行提供参数给'configure'脚本来设置编译时的选项,从而实现定制安装。
特别的,可选的编译进 ProFTPD 的软件模块也可以现在这种方式。
除了'configure'脚本的这些设置外,'include/options.h'文件中还包括了许多的可以很
容易调整的编译时选项,可以影响ProFTPD的操作。这些选项不会被'configure'脚本所修改
。每一个选项都在其自身的头文件中做了说明。这些选项几乎不需要修改,而且大部分在运行时
能被proftpd.conf配置文件中的配置指令所覆盖。
注意:一个RPM规格的示例文件已经包括在 contrib/dist/rpm/ 目录里了.
包维护者注意:
请不要去掉 ELF .comment 和 .note 部分.
如果你在一个有点不太常见的(新的或旧的)系统平台上安装ProFTPD,请考虑可以记录下你
的经验和大家分享。
--------
系统需求
--------
o ANSI/ISO C89/C90 C语言编译器, 例如:GNU gcc
o GNU make, 大部分系统应该都有
o ANSI C and POSIX run-time libraries
o BSD sockets API
o 磁盘空间: 约2.5 MB 用于解包, 6-8 MB 用于编译, 约2 MB 用于安装
--------
安装指南
--------
0. 计划你的安装。
请在开始以前读完整个安装的所有步骤。
有许多的编译定制项是你可能希望使用到的,尤其是关于用户认证的。请参考完整阅读完
README.modules 文件和其他的 README.* 文件和 contrib/README.* 文件。
注意,以下的模块是缺省包含了的,是不需要再明确添加了的: mod_auth, mod_core,
mod_log, mod_ls, mod_site, mod_unixpw and mod_xfer.还有,如果 PAM 被
检测到已经配置了的话,mod_pam 模块将会被自动包括进来。然而,有报告说某些系统
依然要求明确的添加该模块。另外请注意,contrib/mod_test 模块是仅做测试的不具
有任何实际的功能,请不要试图去使用它。
你需要指定你系统中的共享库的搜索路径。查询你的系统和编译器的文档。通常这个操作
是使用 -R 或 -rpath 选项的。在 AIX 系统上,需要特别小心的设置这个路径,请参
考README.AIX。
提示: 如果你的配置命令行变得长或复杂了,你可以试着把它变成为一个 sh 脚本文件,
比如,叫: '.configcmd'。
1. 配置软件。
运行源代码目录顶层的 GNU autoconf 'configure' 脚本文件来创建 config.h 文件和
所有的 Makefiles。除了配置 ProFTPD 使其能在你的系统上进行编译之外,你还可以
在这一步定制一些参数或给 ProFTPD 添加可选的特性。有许多配置选项可用。如果使用
默认值的话,你只须简单的运行:
$ ./configure
默认下,ProFTPD的文件会被作为 'root' 用户的身份来安装,用户组属性是 /etc/group
中的第一个组,gid为0,通常是 'root' 或 'wheel'。如果你希望采用不同的用户及用
户组身份来安装的话,请在运行 configure 脚本前设置环境变量 install_user 和
install_group。使用 Bourne-ish 风格的 shell (例如:sh, ksh, bash)的话,你可
以是用以下的命令来做:
$ install_user=root install_group=wheel ./configure
类似的,像典型的 GNU autoconf 脚本一样,可以用这种方法设置编译系统的其他的属
性,比如,设置编译器:
$ CC=gcc CFLAGS='-O -g' ./configure
其他的选项作为命令行参数传递给 configure 脚本。
通过执行 './configure --help' 可以列出所有有效的配置参数。
默认下, proftpd 和 ftpshut 安装在 /usr/local/sbin/,ftpcount 和 ftpwho 安装
在/usr/local/bin/,配置文件在/usr/local/etc/,man帮助页在/usr/local/man/man?/.
此外,/usr/local/var/proftpd/ 被用来存放运行时的 scoreboard 文件。参考
'./configure --help' 输出中的 "Directory and file names" 一节中的参数来改变这
些默认设置。 比如:把所有目录放置在 /usr/ 下而不是 /usr/local/ 下时,你可以
使用以下命令:
$ ./configure --prefix=/usr
或者, 把配置文件放在 /etc/ 下,而把运行时的状态文件放在 /var/proftpd/下,你
可以使用以下命令:
$ ./configure --sysconfdir=/etc --localstatedir=/var
可选的ProFTPD模块可以通过使用'--with-modules=LIST'参数包含进来,其中的'LIST'
是一个由冒号隔开的列表。这只适用于那些 contrib/ 目录下的可选模块( modules/
目录下的核心模块不是被强制包含了就是被默认包含了)。例如,如果你希望包括readme
和LDAP两个模块的话,你可以使用命令:
$ ./configure --with-modules=mod_readme:mod_ldap
如果你希望使用系统的 shadow 密码文件来进行用户认证的话,你在某些系统上就需要
添加上 '--enable-autoshadow' 或 '--enable-shadow'了。使用 autoshadow 的话就
使 proftpd 既能使用 shadow 密码文件也能使用传统的密码文件。
如果你希望使用 SQL 来进行用户认证的话,你必须指定 mod_sql 和一种 后台 SQL 模
块(SQL backend module), mod_sql_mysql 或 mod_sql_postgres 。此外,后台 SQL
模块(SQL backend module)必须紧跟在模块列表的后面给出,比如:
'--with-modules=mod_sql:mod_sql_postgres'. 否则,编译完后,SQL认证功能是不
能起作用。
确信在你重新执行 configure 配置脚本前,首先执行了 'make distclean' 命令。
2. 核实正确的配置操作。
观察 configure 脚本的输出。在 configure 脚本运行完后,你可以检查 config.h 文件,
确信 configure 脚本没有对你的系统做任何错误的假设。
3. 编译这个软件。
在源代码的顶层目录运行 'make'。在某些系统(比如:BSDI),你可能需要使用 GNU make
(也经常称作 'gmake' 或 'gnumake')来代替系统缺省的 make。观察编译过程的输出,
确认没有错误产生。在某些系统(特别是AIX 和 IRIX)你可能看到一些编译或连接警告。这
些一般都可以不理睬。
4. 测试软件。
从 ProFTPD 1.2.0 起,没有自动的回归(regression)测试了。
然而,鼓励去执行你自己的 ad-hoc,手工测试。
注意,你能够直接在命令行启动proftd,不过,记住,只有作为 root 运行时才能正确
获得所有的功能特性。虽然如此,很多操作能够在没有 root 权限的情况下实现。通过
使用命令行参数 '-c' 可以指定其他的配置文件。在配置文件中,可以改变默认的TCP
端口 ftp (21) 和 ftp-data (20) 为其他的值,也可以指定一个其他的 passwd文件。
既然作为守护进程不能更改它的uid,你也同样必须指定用户名和组名来匹配来启动守
护进程。
为了示范这些过程,一组配置文件示例给出在了 sample-configurations 目录下。
% sh sample-configurations/PFTEST.install
Sample test files successfully installed in /tmp/PFTEST.
% ./proftpd -n -d 5 -c /tmp/PFTEST/PFTEST.conf
然后,打开另一个窗口,连接到非特权端口。PFTEST.conf 使用了 2021 端口,而
PFTEST.passwd 定义了一个用户名和密码都为 "proftpd" 的用户。使用传统的 Unix
ftp 客户端软件连接的话,应该会得到以下的状态:
% ftp -n -d
ftp> open <hostname> 2021
ftp> user proftpd
---> USER proftpd
331 Password required for proftpd.
Password: [proftpd]
---> PASS proftpd
230 User proftpd logged in.
ftp>
提供的 PFTEST.passwd 文件是传统 Unix 格式的。你所使用的系统可能采用了不同的
文件格式,这样你就需要自己创建了。此外,如果 PFTEST.install 脚本失败的话,你
就不得不使用另外一种方式在 PFTEST.conf 文件中加入你的用户和用户组了。
如果你遇到了任何问题,请先确定你阅读了下面的"疑难解答"和"帮助"部分。
5. 打包软件。
从 ProFTPD 1.2.0 起, 除了 contrib/dist/rpm/ 目录下的RPM规格包含外不再提供其
他的打包程序了。
6. 安装软件。
注意:这一步已经以下的几步可能需要拥有 root 权限。
在源代码树的顶层运行 'make install' 命令来进行安装,除非是已经创建了某系统下
的特定的安装包(比如:RPM)。这一步将会安装ProFTPD的执行文件、man帮助页和拷贝至
'sample-configurations/basic.conf'的基本配置文件。这个基本配置文件在系统中
的路径默认是'/usr/local/etc/proftpd.conf',不过,也可在第一步中改成别的。
如果已经创建了软件安装包,请依照安装包系统合适的过程来安装ProFTPD的包。
7. 修改 proftpd 的配置文件。
如果在 proftpd.conf 中指定的用户和用户组在你的系统中不存在时,proftpd将不能
运行。请根据需要编辑和修改 proftpd.conf。大多数系统用 "nobody" 组来代替
"nogroup" 组。根据你运行 proftpd 的方式,要么采用超级服务器的方式( inetd 或
xinetd ),要么作为一个独立服务器(standalone daemon)来运行,编辑 proftpd.conf
文件,改变 ServerType 指令来匹配你的选择,不是 "ServerType inetd" 就是
"ServerType standalone"。第四步 'make install' 时安装的 "basic.conf" 配置
文件中默认是设置成 "standalone" 的。
8. 修改超级服务器 inetd 的配置文件。
编辑 /etc/inetd.conf 文件,之后发送 -HUP 信号给 inetd 进程,使其重新读取更新
的配置文件。某些系统利用其他的机制去告诉 inetd 去重新读取它的配置文件,比如:
AIX采用 'refresh -s inetd'。查看你的系统文档来找到合适的命令。
如果 proftpd 从 inetd运行,在 /etc/inetd.conf 中查找像下面内容的行:
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
然后将其替换成:
ftp stream tcp nowait root /usr/local/sbin/proftpd proftpd
或者,如果你系统中安装了 tcp wrappers ,修改成的行的内容可能会像下面这样:
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/proftpd
如果 proftpd 是运行在 standalone 模式,你需要注释掉 /etc/inetd.conf 中任何与
ftp 相关的行,方法是在每一行的最开头插入一个 '#'。然后发送消息来使 inetd 进程
重新读取 /etc/inetd.conf。
如果你的系统使用 xinetd 来代替 inetd的话,要么编辑 /etc/xinetd.conf 文件,
要么在 /etc/xinetd.d/ 目录中增加一个名为 proftpd 文件,内容类似如下:
service ftp
{
flags = REUSE
socket_type = stream
instances = 50
wait = no
user = root
server = /usr/sbin/proftpd
bind = <the-ip-you-wish-to-bind-to>
log_on_success = HOST PID
log_on_failure = HOST RECORD
}
更多的信息可以在 FAQ、用户手册以及你系统中的 xinetd 文档中找到。
9. 修改系统启动脚本。
如果作为 standalone 模式来运行的话,你可能需要编辑你系统中的启动脚本来使
proftpd 在系统启动时自动运行。那些使用 SysV 类型的单个启动脚本的系统,在原
代码中包括了一个 init 脚本的示例: "contrib/dist/rpm/proftpd.init.d"
10. 创建运行时状态目录。
为了使 MaxClients 和 MaxClientsPerHost 指令以及 ftpwho 和 ftpcount 工具能够
工作,proftpd必须要有一个目录来彼此它的记分板(scoreboard)文件。缺省使位于
'/usr/local/var/proftpd/'的,不过,它可以在安装配置过程的第一步中进行修改。
默认的位置还可以在运行时被 proftpd.conf 配置文件中的 "ScoreboardPath" 指令
的值所覆盖。不管使用的哪个目录,它都必须在启动 proftpd 前就已经预先存在了。
如果你是采用的是软件包安装方式安装的,安装脚本可能已经创建了缺省的目录了。虽
然如此,如果它没有的话,你必须手工创建。这个目录没有什么特殊的权限要求,除非
你希望限制 ftpwho 和 ftpcount 的运行。
11. 核实操作。
一旦 proftpd 以 inetd 模式或 standalone 模式运行起来了,试着 ftp 到你的系统
中以确信一切已经开始运行了。如果你遇到了问题,请查看下面的"疑难解答"和"帮助"
部分。
12. 定制 proftpd 配置文件。
如果你希望添加一个匿名 ftp 或另外创建一个更完善的 ftp 配置文件,请阅读更多的
有关 ProFTPD 配置方面的文档:
配置文件示例: sample-configurations/*.conf
配置参考文档: doc/Configuration.html
配置 FAQ: doc/FAQ-config.html
文档: http://pdd.sourceforge.net/
http://www.proftpd.org/docs/
FAQ: http://pdd.sourceforge.net/faq/proftpdfaq.html
注意,某些系统为匿名ftp和任何其他 chroot 目录的预备需要特定的系统特性。同样,
需要清楚,对于"ersistentPasswd"、RequireValidShell"和"UseFtpUsers"这样的配
置指令需要给予特别的注意。
为检查新的或修改过的配置文件,可在命令行下运行'proftpd -t -c <new_conf_file>'
命令。
你可以在不妨碍一个正在运行的服务器的情况下,通过在另一个不同端口运行一个分离
的测试服务器来测试你的配置文件中的实际功能。通过配置文件中的 "ort" 指令来指
定要使用到的端口,不过,在将新配置文件应用到最终服务器时不要忘记将端口号改回
来。
祝您好运!
--------
疑难解答
--------
这个部分很不完全,请参考FAQ和其他的资源来获得更多协助。
T1. 编译时的很多问题通过给出正确的选项和到编译器的搜索路径就可以很容易的解决了。
然而,有些问题确实解决起来很困难。常常有问题是因为头文件或C语言的预处理宏名
有冲突而产生的。少数包(packages)已经知道安装 conf.h 头文件在
/usr/local/include.有时,必须要求助于查看预处理器的输出才行。尽管类似于
`cc -E file.c`的命令经常可以解决,不过,还是请参考你的编译器文档,从而决定
应该怎么做。
一些常见的错误信息包括:
o "symbol ap_signal undefined in main.o"
这通常意味着 fnmatch.h 头文件被包括在了 Apache 的 ap_config.h
头文件中,尽管 proftpd 并没有链接 Apache 的库。这个错误主要产生
在 Solaris 8 系统上,不过,类似的问题也曾经在 Red Hat 6.0 系统
中的 <hsregx.h> 头文件上被报告过。
T2. 如果你遇到了运行时问题,先检查你的系统日志(syslog)中的消息。proftpd 守护进程
记录了它遇到的所有错误情况,包括解析配置文件时出现的问题。认证相关的消息被系统
日志工具 "auth" 或 "authpriv" (如果可用的话) 记录下来。其他所有的消息使用
系统日志的守护进程工具来记录,除非使用命令行选项 "-n" 或 SyslogFacility 、
SystemLog 指令来进行重定向。查看你系统中的 syslogd.conf 来了解 syslogd
怎么处理这些消息。
一些常见的错误信息包括:
o "inet_create_connection() failed: Operation not permitted"
这通常意味着proftpd不是以root用户的身份开始运行的。
o "bind: unable to bind to port" or "Address already in use"
这通常意味着另外一个进程已经在使用指定的ftp端口了,不是inetd、xinetd
就是另外一个正在运行着的FTP服务器。
o "Fatal: Socket operation on non-socket"
这通常意味着在 proftpd.conf 配置文件中 ServerType 指令被配置成 inetd
(超级服务器)方式而不是 standalone(独立服务器) 方式来运行。
o "received: PASS (hidden)"
"roFTPD terminating (signal 11)"
这通常意味着要求的 shadow passwd 文件支持没有被编译进去。试着回到编译
的第一步,要么添加 '--enable-autoshadow' ,要么添加 '--enable-shadow'
选项到 configure 的命令行中重新编译。
o "Fatal: unknown configuration directive 'AuthPAMAuthoritative'
on line NN of '/etc/proftpd.conf'."
This means that either 'AuthPAMAuthoritative' was misspelld or
这意味着要么 'AuthPAMAuthoritative' 拼写错了,要么 mod_pam 没有被编译
到ProFTPD中去。如果是后者,你需要重新配置、编译proftpd,使用
"./configure --with-modules=mod_pam ..."选项明确的添加上模块 mod_pam。
如果系统不能登录而你的系统使用了PAM认证的话,你还需要配置PAM和FTP一起工作。更多的
细节,请参考你系统的PAM文档。如果你选择的是软件包的安装方式的话,希望PAM的配置工作
是自动完成的。在 Linux 系统,下面的命令也许会有用:
% cp -p contrib/dist/rpm/ftp.pamd /etc/pam.d/ftp
如果登录的FTP客户端出现了类似 "server error 500, server shut down" 的信息的
话,可能意味着你的系统中有一个失效的 /etc/shutmsg 文件存在。你应该删掉它。
T3. 使用 "-d N" 命令行选项来启动 proftpd 守护进程,你可以得到更多的调试信息,其中 N
的范围从1 到 5,值越大,调试信息的数目也越大。如果你采用 standalone的方式运行的
话,使用 "-n" 选项将会阻止守护进程脱离你的终端,使所有的调试信息直接显示在你的终
端上,而不是记在系统日志中(being syslogged)。
T4. 如果你遇到的问题通过错误信息还是不能很好解决的话,你可以检查一下在官方的发布站点
上是不是有更新的 ProFTPD 发布,或许你的问题已经在新版本中解决了。了解什么样的问
题已经在新版本中得到了解决的最快的方式是阅读每一个新发布版本中的 ChangLog 文件。
T5. 如果你的系统中有系统调用跟踪工具的话,你可以使用它来诊断什么失败了。这个方法经常用
来侦察(spot)文件打开错误,包括共享库(shared libraries)。
一些系统调用跟踪工具:
o truss (Solaris, SVR4 的派生, Unixware, AIX5L, FreeBSD)
o trace (SunOS 4.x)
o tusc (HP/UX 11.x: ftp://ftp.cup.hp.com/dist/networking/misc/)
trace (HP/UX 10.x: ftp://hpux.cs.utah.edu/hpux/Sysadmin/trace-1.6/)
http://hpux.cs.utah.edu/hppd/hpux/Sysadmin/trace-1.6/
http://devresource.hp.com/devres ... Library.html#perfhp
o syscalls, trace (AIX 4.x); sctrace (AIX: [$$$] http://www.tkg.com)
o par (IRIX)
o alpha-trace (Digital Unix: ftp://ftp.mrc-lmb.cam.ac.uk/pub/jkb/)
o ktrace/kdump (NetBSD, OpenBSD)
o strace, ktrace/kdump, ltrace (Linux)
T6. 另外一个诊断技术是监视FTP客户端和ProFTPD服务器端的FTP协议通信情况。许多FTP客户端
应用程序有一个调试和跟踪的选项。尽管需要有详细的FTP协议的知识来进行分析,不过,可以
可以使用 telnet 来连接并直接和 proftpd 服务器 对话。最后,FTP协议的会话情况能够使
用网络监视工具来跟踪,像tcpdump、etherfind、snoop和netnoop。
T7. 更进一步的调试可能需要使用调试器了,而使用调试器就可能需要使用调试选项重新编译一遍
proftpd 了。请参考你的编译器和调试器的相关文档。
----
帮助
----
H1. 在你向邮件列表上请求帮助前,先浏览一下有效的文挡,包括:FAQ、邮件列表上可搜索的档案。
不仅很多常见问题的回答在其上已经有了,而且,通过他们得出答案通常要比发到邮件列表要快。
以下"参考资源"一节给出了文档的指向和链接。
H2. 在你向邮件列表上请求帮助时,请务必把问题描叙得清楚和简明些,不过,也要提供足够的信息
是人们能够帮助你。像那种仅仅以类似"It doesn't work. Help!"这样的文字开始的是不
大有可能得出任何有用的回答的。尽可能完整的描述你的问题,包括:你认为是那里错了,你希
望该是什么样子,和一些有关的错误日志消息或调试信息。除非问题产生于基本的
proftpd.conf 配置文件或它的最小化派生,包括你的全部或部分 proftpd.conf 文件可能
是有用的。
所以, 至少应该包括:
o 操作系统的类型和版本 (例如: `uname -a`)
o ProFTPD 的完整版本号 (`proftpd -vv`)
o ProFTPD 的模块列表 (`proftpd -l`)
以下命令可以帮助进一步的确定编译信息,尤其是当你安装的是由提供商打包好了的安装包,而不是
由你自己从源代码开始编译的时更是如此:
o `what proftpd` 或 `ident proftpd`
如果你的系统使用ELF对象文件格式的话,还有更多的编译信息是可以利用的:
o `objdump -f proftpd` 或 `dump -v -f proftpd`
或 `elfdump -v -f proftpd`
o `objdump -j .comment proftpd` 或 `dump -n .comment proftpd`
或 `elfdump -n .comment proftpd`
o `mcs -p proftpd`
o `objdump -j .note proftpd` 或 `dump -v -n .note proftpd`
或 `elfdump -v -n .note proftpd` 或 `mcs -p -n .note proftpd`
H3. 请不要使用 bug 报告系统来提交有关编译和配置方面的问题。这些问题请发到邮件列表中。
为了保存开发资源,请您在有合理的信心确认那是一个代码错误、移植问题或编译系统问题
时再提交 bug 报告。即使那样,也请先搜索一下 bug 系统来看看是否你发现的错误已经
被报告了。如果是的话,添加你自己的最好的意见来评价这条已经存在的错误报告,特别是
,要么确认这个错误的存在,要么提供更多的诊断和调试信息。
更多有关报告 bugs 的建议, 请看:
http://bugs.proftpd.org/bugwritinghelp.html
--------
参考资源
--------
R1. 基本的.
其他主题: README.*, contrib/README.*
配置参考: doc/Configuration.html
常见问题: doc/FAQ-config.html
WWW: http://www.proftpd.org
FTP: ftp://ftp.proftpd.org/distrib/
镜像站点列表: http://pdd.sourceforge.net/mirrors.html
R2. ProFTPD 文档项目.
文档包括一个配置参考,用户向导的草稿以及FAQ。文挡的格式包括单一的有链接的网页文件,
PostScript,PDF文件和纯文本文件.
注意,这里提到的的配置参考可能涉及到的核心代码比你现在所用的新,所以,参考你的源代码
目录下的 doc/Configuration.html 文件才不会产生更多的困惑。
(主力站点): http://pdd.sourceforge.net/
(镜像1): http://hamster.wibble.org/proftpd/
(镜像2): http://www.flyhmstr.demon.co.uk/proftpd/
R3. 邮件列表.
最终用户列表
(订阅): proftpd-users-request@proftpd.org
(提交): proftpd-users@proftpd.org
(以往档案): http://www.proftpd.org/proftpd-l-archive
开发者列表
(订阅): proftpd-devel-request@proftpd.org
(提交): proftpd-devel@proftpd.org
(以往档案): http://www.proftpd.org/proftpd-devel-archive
公告列表
(订阅): proftpd-announce-request@proftpd.org
(以往档案): http://www.proftpd.org/proftpd-announce-archive
安全报告: security@proftpd.org
R4. Bug 跟踪系统 (Bugzilla).
Bug 报告/补丁: http://bugs.proftpd.org
proftpd-devel@proftpd.org
R5. CVS 仓库.
匿名 CVS: proftpd.org
(指南): http://www.proftpd.org/docs/cvs.html
CVS tarballs: ftp://ftp.stikman.com/pub/proftpd/
ftp://ftp.linuxceptional.com/proftpd/
开发 CVS: cvs.proftpd.net
R6.关于 proftpd.org 和 proftpd.net 的声明.
现在的 www.proftpd.org 和 www.proftpd.net 站点 实际上是相互镜像的站点。官方
proftpd 站点是 www.proftpd.org,然而,为了提供冗余,[url]www.proftpd.net[/url] 将会保
持并运行在一个远程的位置上。
--------------------------------------------------------------------------------
中文版声明:本文根据 proftpd 1.2.6 源代码中的同名英文原文翻译而来(英文原文所在
的原代码压缩包在 ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.6.tar.gz 上可
以找到或通过 http://www.proftpd.org/ 获得),遵循GPL协议。鼓励复制、传播、分发和
修改,不过请保留作者署名和本声明。欢迎来信交流:327wu@263.net |
|