java搭建ftp服务端通过TYPE I指令不能获取二进制文件

一、前言

    在测试硬件从ftp服务端下载二进制文件时,发现windows自带的ftp服务器可以下载,而自己通过java搭建的ftp服务器却不能下载成功。查询了网上的的博客并没有查到有效的解决办法,所以只能通过抓包和阅读ftpserver源码的方式进行查找解决。目前客户端采用硬件访问ftp服务器进行获取二进制文件,不着重研究客户端。

二、使用win11自带的IIs管理器创建ftp服务(具体搭建步骤可网上查询,下图是搭建完成的)

三、使用Wireshark软件抓取type I 指令(type I指令是设置文件传输类型为二进制,缺省为ascii)

从上图可以看到,客户端登录后发送了TYPE I指令,服务端回复为 Type set to I.  此时20231214160743.bin文件下载成功

四、使用java代码搭建FTP服务端

1、pom文件引入ftpserver

	<!--ftp服务-->
		<dependency>
			<groupId>org.apache.ftpserver</groupId>
			<artifactId>ftpserver-core</artifactId>
			<version> 1.1.4 </version>
		</dependency>

 2、java代码

import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.WritePermission;
import java.util.ArrayList;
import java.util.List;
public class FtpUtils {

    public static void main(String[] args) {
        createFtpServer();

    }

    /**
     * 创建匿名用户
     */
    public static void createFtpServer(){
        try {
            FtpServerFactory serverFactory = new FtpServerFactory();
            BaseUser user = new BaseUser();
            user.setName("anonymous");
           // user.setPassword("anonymous");
            user.setHomeDirectory("D:\\IIsFtpFile\\");
            List<Authority> authorities = new ArrayList<>();
            //权限
            authorities.add(new WritePermission());
            user.setAuthorities(authorities);
            serverFactory.getUserManager().save(user);
            ListenerFactory listener=new ListenerFactory();
             listener.setPort(21);
            serverFactory.addListener("default", listener.createListener());//覆盖默认监听
            FtpServer server = serverFactory.createServer();
            server.start();
            System.out.println("ftp搭建完成");
        }catch (
                Exception e){
            e.printStackTrace();
        }
    }
}

3、此时启动服务端,抓取type I 指令

可以发现ftpf服务端指令回复和win11自带ftp服务有所不同,但是匿名登录是成功的。有可能出现 Command TYPE okay.这个回复指令客户端不能解析造成的。

四、ftpserver-core源码粗略分析并解决

由上图可以看到抓包中的回复命令:Command TYPE okay. 可以继续看下defaultProperties配置文件的路径

可以根据路径ora/apache/ftoserver/message/FTpStatus.properties找到配置文件

该文件中有很多配置命令,我们可以修改为200.TYPE=Type set to I.  这里采用比较暴力的方式直接在maven里找到ftpserver-core-1.1.4.jar用压缩工具打开后找到FTpStatus.properties直接修改并保存(学术不精,有其他更合适的方案,可以私发我,向其学习!)

五、解决后再重新抓取正常命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值