Java - 如何确定服务器是FTP还是SFTP?

Spa*_*jjm 6 java ftp sftp

我正在用 Java 创建一个类,从服务器下载特定文件。我有一种可以直接从FTP服务器下载的方法,还有一种可以从SFTP服务器下载的方法。

在不对主机名进行任何假设的情况下(不检查它是否以 ftp:// 或 sftp:// 开头,因为有时服务器可能是本地的),有没有办法确定服务器是 FTP 还是 SFTP,因此使用哪种方法?

理想情况下,我想以编程方式确定,而不仅仅是在失败时尝试替代方案。感谢您提前提供任何帮助!

编辑:对于任何感兴趣的人,我的非常基本且绝对不完美的解决方案是这样的:

private int determineServerProtocol(String host, String port) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try (Socket socket = new Socket(host, Integer.parseInt(port))) {
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            result = in.readLine();
            out.close();
            in.close();
        } catch (NumberFormatException | IOException e) {
            e.printStackTrace();
        }
        if (result.contains("SSH")) {
            System.out.println("Server is SFTP");
            // do things...
        } else {
            System.out.println("Server is FTP");
            // do things...
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 1

你可以做一个telnet。Apache Commons 提供了许多互联网协议的客户端。

https://commons.apache.org/proper/commons-net/

然后分析答案。

据我所知,所有的 SSH 服务器都会用 SSH 来回答一些问题。

telnet demo.wftpserver.com 2222
Trying 199.71.215.197...
Connected to demo.wftpserver.com.
Escape character is '^]'.
SSH-2.0-WingFTPServer
Run Code Online (Sandbox Code Playgroud)

不是 SSH

telnet  ftp.funet.fi 21
Trying 193.166.3.2...
Connected to ftp.funet.fi.
Escape character is '^]'.
220 FTP Welcome
Run Code Online (Sandbox Code Playgroud)