首页 > 解决方案 > 如何在 Apache FTP 上实现 ALLO 命令?

问题描述

我们有一个在网关中运行多年的嵌入式 Apache FTP 服务器。它总是毫无问题地工作。

但是现在一个客户正在尝试连接一个我们以前从未有过的品牌的设备,并且与迄今为止的所有其他客户相反,那个东西提前发送了 ALLO 命令以确保服务器有足够的空间。

但是 Apache FTP 似乎不知道该命令。跟踪日志指出:

收到:ALLO 77482 发送
:502 命令 ALLO 未实施。

随后客户端断开连接。

该命令也不存在于 Apache 文档中: https ://mina.apache.org/ftpserver-project/ftpserver_commands.html

所以问题是,我可以以某种方式将自己的实现插入服务器吗?为了清楚起见,我不是在问如何实现该功能。我如何将自己的实现传递给 Apache FTP 以供使用。如果可以在不接触源代码的情况下做到这一点。

由于有问题的应用程序已经运行了很长时间非常稳定,我真的不想把 Apache FTP 服务器从那里撕下来并嵌入另一个......

标签: apacheftp

解决方案


好吧,一旦我深入了解正确的代码,这非常简单。

命令的实现很简单,在这种情况下,我刚开始使用存根进行测试:

class ALLO : AbstractCommand() {

    override fun execute(session: FtpIoSession, context: FtpServerContext, request: FtpRequest) {

        session.write(LocalizedFtpReply.translate(session, request, context,
                FtpReply.REPLY_200_COMMAND_OKAY, "ALLO", "bring it!"))
    }
}

继承 AbstractCommand,覆盖执行并向会话写入响应。

问题当然是如何让服务器知道实现,这也很简单,尽管肯定似乎没有任何文档。但是您可以只实例化一个 CommandFactoryFactory,映射您的实现,构建 CommandFactory 并将其设置在 FtpServerFactory 中:

        val commandFactoryFactory = CommandFactoryFactory()
        commandFactoryFactory.addCommand("ALLO", ALLO())
        serverFactory.commandFactory = commandFactoryFactory.createCommandFactory()

推荐阅读