apache ftpserver服务器安装及服务启动问题解决

发布时间 2023-11-23 23:34:30作者: 梦想与现实边缘

 

在安装apache ftpserver后作为系统服务启动时遇到不能启动成功的问题,在网上各种搜索,发现很多人也遇到了同样的问题,折腾了1天,尝试了添加dll动态链接库、tomcat.exe替换ftpd.exe等还是没搞定。

最后查看服务安装脚本service.bat,发现问题所在,现记录下过程中遇到的坑,分享出来参考,避免其他朋友踩坑。

 

先总结如下几点关键:

  (1):在使用jdk的java虚拟机情况下,apache ftpserver安装为系统服务时,需要注意修改service.bat脚本文件中java虚拟机的路径位置,

       不修改的话会去找jre下的java虚拟机。当然,如果本来就使用的是jre,就不用修改了。

  (2):启动服务时报不是有效的32位程序的错误,就需要用tomcat的执行文件修改位为同名文件进行替换。

  (3):注意,安装脚本service.bat需要在管理权限的cmd下执行,同样ftpdw.exe服务管理程序也需要管理权才能执行。

  (4):service.bat脚本在设置jvm时还可以再优化,在找不到jre情况下,可以查找jdk的路径,如果还是找不到,再设置为auto,并给出警告。

 

 

下面详细说明安装过程和分析过程:

本人操作系统为win10 64位。java安装的jdk19,不是jre。

apache ftpserver的下载安装就不多说了,直接到官网https://mina.apache.org/ftpserver-project下载apache ftpserver 1.2.0,解压。

 

基本操作步骤:

1、修改res/conf/下的ftpd-typical.xml文件内容,修改port=“21”,增加encrypt-passwords="clear",保证读取users.properties中的用户密码为明文密码,

如果不增加encrypt-passwords设置的话,读取的密码就不是明文密码,实际上是用MD5对密码哈希后的密文。

 1 <server xmlns="http://mina.apache.org/ftpserver/spring/v1"
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3   xsi:schemaLocation="
 4      http://mina.apache.org/ftpserver/spring/v1 https://mina.apache.org/ftpserver-project/ftpserver-1.0.xsd  
 5      "
 6   id="myServer">
 7   <listeners>
 8     <nio-listener name="default" port="21">
 9         <ssl>
10                 <keystore file="./res/ftpserver.jks" password="password" />
11             </ssl>
12     </nio-listener>
13   </listeners>
14   <file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear"/>
 15 </server>

 

2、修改users.properties文件中用户名、密码及homedirectory路径:

结合1中增加的encrypt-passwords="clear",这里用户a的密码就是a,如果没有增加encrypt-passwords="clear",

则这里的userpassword就必须是真实密码进行md5计算得到的16字节串。

ftpserver.user.a.userpassword=a
ftpserver.user.a.homedirectory=G:/ftpdir
ftpserver.user.a.enableflag=true
ftpserver.user.a.writepermission=true
ftpserver.user.a.maxloginnumber=0
ftpserver.user.a.maxloginperip=0
ftpserver.user.a.idletime=0
ftpserver.user.a.uploadrate=0
ftpserver.user.a.downloadrate=0

ftpserver.user.anonymous.userpassword=
ftpserver.user.anonymous.homedirectory=./res/home
ftpserver.user.anonymous.enableflag=true
ftpserver.user.anonymous.writepermission=false
ftpserver.user.anonymous.maxloginnumber=20
ftpserver.user.anonymous.maxloginperip=2
ftpserver.user.anonymous.idletime=300
ftpserver.user.anonymous.uploadrate=4800
ftpserver.user.anonymous.downloadrate=4800

 

3、先用ftpd.bat直接简单验证独立服务能启动成功,登录也正常,然后ctrl+c终止服务。

F:\mytool\server\apache-ftpserver-1.2.0\bin>ftpd.bat res\conf\ftpd-typical.xml
Using XML configuration file res\conf\ftpd-typical.xml...
FtpServer started
Stopping server...
终止批处理操作吗(Y/N)? Y

F:\mytool\server\apache-ftpserver-1.2.0\bin>

 

4、安装为windows系统服务:

  a)执行service.bat install ftpd res/conf/ftpd-typical.xml安装ftpserver为系统服务:

F:\mytool\server\apache-ftpserver-1.2.0\bin>service.bat install ftpd res/conf/ftpd-typical.xml
Installing the service 'ftpd' ...
Using FTPD_HOME: F:\mytool\server\apache-ftpserver-1.2.0
Using JAVA_HOME: C:\Program Files\Java\jdk-19
Using JVM: auto
start
start;res/conf/ftpd-typical.xml
start;res/conf/ftpd-typical.xml
The service 'ftpd' has been installed.

F:\mytool\server\apache-ftpserver-1.2.0\bin>

 

如上,提示ftpd服务安装成功后,在bin路径下找到ftpdw.exe以管理权限执行,结果服务启动失败;到系统服务下找到Apache FtpServer ftpd,启动也失败:

 

查看日志信息如下,返回creating java失败:

[2023-11-22 23:00:22] [info] Running Service...
[2023-11-22 23:00:22] [info] Starting service...
[2023-11-22 23:00:22] [947  prunsrv.c] [error] Failed creating java 
[2023-11-22 23:00:22] [1202 prunsrv.c] [error] ServiceStart returned 1
[2023-11-22 23:00:22] [info] Run service finished.

 

  b)遇到问题后,本来以为前面安装服务时输出信息中“Using JVM: auto”是正确的,可以自动查找java虚拟机,结果阅读service.bat脚本时发现,

只有在这个%JAVA_HOME%\bin\jre\server\jvm.dll找不到的情况下才会设置为auto,而这个路径下包含了jre子路径,实际我的环境中并没有安装jre,

用的是jdk,因此安装服务时会设置虚拟机为auto,实际上auto表示没有找到虚拟机。因此导致“Failed creating java”报错,如下:

 

 

set PR_DESCRIPTION=Apache FtpServer (http://mina.apache.org/ftpserver/)
set PR_INSTALL=%EXECUTABLE%
set PR_LOGPATH=%FTPD_LOGPATH%
set PR_CLASSPATH=%FTPD_CLASSPATH%
rem Set the server jvm from JAVA_HOME
set PR_JVM=%JAVA_HOME%\bin\jre\server\jvm.dll
if exist "%PR_JVM%" goto foundJvm
rem Set the client jvm from JAVA_HOME
set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll
if exist "%PR_JVM%" goto foundJvm
set PR_JVM=auto
:foundJvm
echo Using JVM: %PR_JVM%

 

  c)根据我系统中java虚拟机的实际位置,将脚本中的jre去掉,如下

set PR_DESCRIPTION=Apache FtpServer (http://mina.apache.org/ftpserver/)
set PR_INSTALL=%EXECUTABLE%
set PR_LOGPATH=%FTPD_LOGPATH%
set PR_CLASSPATH=%FTPD_CLASSPATH%
rem Set the server jvm from JAVA_HOME
set PR_JVM=%JAVA_HOME%\bin\server\jvm.dll
if exist "%PR_JVM%" goto foundJvm
rem Set the client jvm from JAVA_HOME
set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll
if exist "%PR_JVM%" goto foundJvm
set PR_JVM=auto
:foundJvm
echo Using JVM: %PR_JVM%

 

  卸载服务后,重新安装一次,java虚拟机的位置就正确了


 F:\mytools\server\apache-ftpserver-1.2.0\bin>service.bat remove ftpd

  The service 'ftpd' has been removed

F:\mytool\server\apache-ftpserver-1.2.0\bin>service.bat install ftpd res/conf/ftpd-typical.xml
Installing the service 'ftpd' ...
Using FTPD_HOME: F:\mytool\server\apache-ftpserver-1.2.0
Using JAVA_HOME: C:\Program Files\Java\jdk-19
Using JVM: C:\Program Files\Java\jdk-19\bin\server\jvm.dll
start
start;res/conf/ftpd-typical.xml
start;res/conf/ftpd-typical.xml
The service 'ftpd' has been installed.

F:\mytool\server\apache-ftpserver-1.2.0\bin>

 

   d)再次用ftdw.exe启动服务,或在命令行用net start ftpd,还是启动失败,查看日志提示“ %1 不是有效的 Win32 应用程序”,如下:

[2023-11-23 09:15:51] [info] Running Service...
[2023-11-23 09:15:52] [info] Starting service...
[2023-11-23 09:15:52] [174 javajni.c] [error] %1 不是有效的 Win32 应用程序。
[2023-11-23 09:15:52] [947 prunsrv.c] [error] Failed creating java C:\Program Files\Java\jdk-19\bin\server\jvm.dll
[2023-11-23 09:15:52] [1202 prunsrv.c] [error] ServiceStart returned 1
[2023-11-23 09:15:52] [info] Run service finished.
[2023-11-23 09:15:52] [info] Procrun finished.

   

5、结合网上搜索的帖子,说ftpd.exe只是一个服务外壳,在64位系统下存在问题,需要用tomcat6.exe修改位ftpd.exe,然后替换掉

ftpd.exe,于是下载tomcat7.exe进行替换后重新启动服务,终于启动成功!!!,后续尝试用tomcat10的,也可以启动成功,自此,

apache ftpserve的服务问题解决。