先来简单介绍一下apache ftp server 吧,顾名思义这个是Apache 下的一个东东,个人感觉还是很新的,到现在才是1.0.X ,不过还是相信Apache 的品牌效应,这个东东用起来还是很方便的,通过配置文件可以对ftp 服务相关参数进行灵活配置,能够支持基于配置文件和数据库的两种用户权限管理,另外还支持SSL 协议和数字证书机制。
下面是官网的简单介绍:
The Apache FtpServer is a 100% pure Java FTP server. It's designed to be a complete and portable FTP server engine solution based on currently available open protocols. FtpServer can be run standalone as a Windows service or Unix/Linux daemon, or embedded into a Java application. We also provide support for integration within Spring applications and provide our releases as OSGi bundles.
接下来我就按三部分介绍apache ftp server 的使用。
1. 独立部署apache ftp server 作为系统服务
2. 作为为window 系统的服务
3. 结合spring 配置嵌入我们自己的系统
注:因为Apache FTP Server 名字写起来太长,以下简称为AFS.
1. 独立部署AFS
1.1 安装 AFS http://mina.apache.org/ftpserver/
我用的版本是1.0.4, 本文就以该版本为例。无需安装下载后直接解压即可。
因为是纯java 编写的程序,所以程序部分windows 和linux ,解压后在程序的bin 目录下有这样一系列的可执行文件。其中ftpd.bat 和ftpd.sh 分别是windows 平台和linux 下的启动命令。
1.2 启动AFS
AFS启动时可以指定使用的具体的配置文件,例如:
bin/ftpd.bat res/conf/ftpd-typical.xml
如果未指定配置文件,那么会默认用自带的res/conf/ftpd-full.xml文件作为配置文件。
到此为止,一个ftp server就已经运行起来了。
1.3 AFS的配置
1.3.1 AFS配置文件详解
以AFS自带的配置文件ftpd-full.xml为例加以介绍。ftpd-full.xml路径为$AFS_HOME\res\conf\ftpd-full.xml.
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd
"
id="myServer">
<!--
Use this section to define custom listeners, or to redefine the
default listener, aptly named "default"
-->
<listeners>
<nio-listener name="default" port="2222" implicit-ssl="true"
idle-timeout="60" local-address="1.2.3.4">
<ssl>
<keystore file="mykeystore.jks" password="secret"
key-password="otherSecret" />
<truststore file="mytruststore.jks" password="secret" />
</ssl>
<data-connection idle-timeout="60">
<active enabled="true" local-address="1.2.3.4" local-port="2323"
ip-check="true" />
<passive ports="123-125" address="1.2.3.4" external-address="1.2.3.4" />
</data-connection>
<blacklist>1.2.3.0/16, 1.2.4.0/16, 1.2.3.4</blacklist>
</nio-listener>
</listeners>
<!--
Use this section to define your Ftplets, they are configured like
regular Spring beans
-->
<ftplets>
<ftplet name="ftplet1">
<beans:bean class="org.apache.ftpserver.examples.MyFtplet">
<beans:property name="foo" value="123" />
</beans:bean>
</ftplet>
</ftplets>
<!-- The user manager, choose one -->
<file-user-manager file="users.properties"
encrypt-passwords="true" />
<!--<db-user-manager>
<data-source>
<beans:bean class="some.datasoure.class" />
</data-source>
<insert-user>INSERT INTO FTP_USER (userid, userpassword,
homedirectory, enableflag, writepermission, idletime, uploadrate,
downloadrate) VALUES ('{userid}', '{userpassword}',
'{homedirectory}',
{enableflag}, {writepermission}, {idletime},
{uploadrate},
{downloadrate})
</insert-user>
<update-user>UPDATE FTP_USER SET
userpassword='{userpassword}',homedirectory='{homedirectory}',enableflag={enableflag},writepermission={writepermission},idletime={idletime},uploadrate={uploadrate},downloadrate={downloadrate}
WHERE userid='{userid}'
</update-user>
<delete-user>DELETE FROM FTP_USER WHERE userid = '{userid}'
</delete-user>
<select-user>SELECT userid, userpassword, homedirectory,
enableflag, writepermission, idletime, uploadrate, downloadrate,
maxloginnumber, maxloginperip FROM
FTP_USER WHERE userid = '{userid}'
</select-user>
<select-all-users>SELECT userid FROM FTP_USER ORDER BY userid
</select-all-users>
<is-admin>SELECT userid FROM FTP_USER WHERE userid='{userid}'
AND
userid='admin'
</is-admin>
<authenticate>SELECT userpassword from FTP_USER WHERE
userid='{userid}'</authenticate>
</db-user-manager> -->
<!-- The file system -->
<native-filesystem case-insensitive="false"
create-home="true" />
<!--
Use this section to define custom commands. Custom commands can also
override already existing commands
-->
<commands use-default="false">
<command name="MYHELP">
<beans:bean class="org.apache.ftpserver.examples.MYHELP" />
</command>
</commands>
<!-- Define the available languages -->
<messages languages="se, no ,da" />
</server>
1.3.1.1 server的配置
这一部分在官网写的很清楚,可以查看http://mina.apache.org/ftpserver/configuration.html。在这里本人凭借英语四级的水平斗胆翻译一下。
属性
描述
必填
默认值
id
配置的server在该XML文件中的唯一标识
是
max-logins
最大同时在线用户数
否
10
max-anon-logins
最大同时在线匿名用户数
否
10
anon-enabled
是否启动匿名登录
否
true
max-login-failures
最大登录失败次数,达到该次数后连接自动断开。
否
3
login-failure-delay
失败登录后连接延迟时间(以毫秒为单位)。防止恶意用户暴力破解密码。
否
500
1.3.1.2 listeners 配置
Listeners组件是负责在ftp server指定的端口上监听client端创建连接和执行命令。一个AFS可以同时有多个listeners。Listeners以name属性作为唯一标识,默认的listener的name为”default”.
Attribute
Description
Required
Default value
name
Listener名称,如果设定listener名称为“default”,那么该listener的设置会覆盖默认的listner。
是
port
Listener监听的端口
否
21
local-address
Server 绑定的本地服务地址
否
All available
implicit-ssl
是否实现SSL的支持
否
false
idle-timeout
空闲连接保持连接状态的时长(单位为秒).
否
300
1.3.2 AFS权限控制
AFS的权限控制有两种方式:文件控制和数据库控制。
1.3.2.1 文件控制权限的配置
通过文件控制只需在server的配置文件中添加以下配置
<file-user-manager file="users.properties" encrypt-passwords="true" />
其中users.properties文件权限控制文件,encrypt-passwords可以指定密码存储的方式,有效值包括“clear”(明文),“md5”,”salted”,这个salted不知道是什么意思,应该和MD5类似吧,估计也是一种加密标准,而且官方鼓励使用salted.
AFS在安装时就提供了一个默认的users.properties文件,配置项一目了然。
1.3.2.1 数据库控制权限
数据库对用户的权限的管理与通过文件类似,不同就是把对用户的配置移到了数据库的表里面。而且AFS提供了建表的sql语句,文件存放在res下的ftp-db.sql。
关于此处的相关配置可以参见上面的完成配置实例,该部分的需要配置insert-user,update-user,delete-user,select-user,select-all-users,is-admin,authenticate。一般情况下我们都会用我们不会单独用AFS来增删改用户,但是update-user、delete-user和insert-user一个都不能少,不然AFS启动时校验通不过。另外我们通常会希望AFS的用户管理与我们的应用系统采用统一管理,也就是不再为AFS建立专用的用户管理表,这时候我们可以通过修改select-user、is-admin、authenticate等配置项来完成。不要以为随便改写查询sql都可以哦,AFS在处理这几个查询时是通过类似rs.getString(列名)的形式获得记录的,也就是说无论我们怎么修改sql,但是数据列名或者别名一定要和AFS提供的默认查询语句匹配上,不然会有无效列名的错误。
关于AFS的配置大概就这些,总的来说各个配置项还是很直观的。现在我们就可以执行bin\ftpd.sh启动AFS了。
2.作为window系统的服务
如果是在windows平台的话,AFS还可以注册为windows的系统服务来运行。方法也很简单,直接执行:
<yourhome>bin\service install
运行成功后,进到windows的服务管理窗口就可以看到我们新注册的名为Apache FtpServer的服务了。当然服务名是可以指定的,只需:
<yourhome>bin\service install <your服务名>
此时创建的服务名就为Apache Ftp Servef <你指定的服务名>
如果我们想注册服务时用特定的配置文件可以执行如下命令:
<yourhome>bin\service install <your服务名> <你需要执行的文件路径>
卸载已经注册的windows服务只需:
<yourhome>bin\service remove <your服务名(不输入为默认)>
3.结合spring配置嵌入我们自己的系统
以上我们介绍的是独立部署AFS,其实AFS还可以结合spring嵌入到我们的应用程序中。
修改web.xml文件添加spring的相关配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
src目录下建立spring配置文件applicationContext-ftpserver.xml
配置方法与前面提到的server配置参数相同,只是此时的server作为spring的一个bean来处理。格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
">
<description>ftpserver demo</description>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/etlui"/>
</bean>
<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd"
id="demoserver"
max-logins="500"
anon-enabled="false"
max-anon-logins="123"
max-login-failures="124"
login-failure-delay="125">
--具体配置参数
</server>
<bean id="ctroller" class="com.harvey.ftpd.ServiceController" init-method="init">
<property name="server">
<ref bean="demoserver"/>
</property>
<property name="server2">
<ref bean="demoserver2"/>
</property>
</bean>
</beans>
其中ServiceController代码如下:
public class ServiceController {
private FtpServer server = null;
public void init() {
try {
server.start();
} catch (FtpException e) {
e.printStackTrace();
}
System.out.println("system exit");
}
public FtpServer getServer() {
return server;
}
public void setServer(FtpServer server) {
this.server = server;
}
}
现在我们就可以将AFS纳入到我们的应用程序的管理范畴之内。
另外再说些其他的,因为server作为spring的一个bean来处理,所以可以配置多个server,也就是为主机配置多个AFS server,虽然可以这样的配置,但是觉得也没有这种必要,只是觉得好玩可以配一下。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com