zoukankan      html  css  js  c++  java
  • 解决:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3

    [摘要:办理:org.apache.commons.net.MalformedServerReplyException: Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3   当应用org.apache.commons.net.ftp.]

    解决:org.apache.commons.net.MalformedServerReplyException: Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3

    当使用org.apache.commons.net.ftp.FTPClient通过协议SSH2进行SFTP连接时报如上错误,原因是它不支持这种方式的连接(使用FTPSClient的SSL也是不行的)。

    示例代码:

    package com.jerval.test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPReply;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class FtpFileList {
    
        private static final Logger LOG = LoggerFactory.getLogger(FtpFileList.class);
    
        public static void main(String[] args) {
            printList();
        }
    
        private static void printList() {
            List<String> list = listFileNames("fca-vm-rds-prod1", "applog", "aaa", "/webapp/myrds1/lib");
            for (String fileName:list) {
                System.out.println(fileName);
            }
        }
    
        private static List<String> listFileNames(String host, String user, String password, String dir) {
            List<String> list = new ArrayList<String>();
            FTPClient ftpClient = new FTPClient();
            try {
                ftpClient.connect(host, 22);
                int reply = ftpClient.getReplyCode();
                if (FTPReply.isPositiveCompletion(reply)) {
                    ftpClient.login(user, password);
                    // ftpClient.changeWorkingDirectory(dir);
                    String[] names = ftpClient.listNames(dir);
                    list.addAll(Arrays.asList(names));
                }
            } catch (IOException e) {
                LOG.error("ERROR!", e);
            } finally {
                close(ftpClient);
            }
    
            return list;
        }
    
        private static void close(FTPClient ftpClient) {
            if (null != ftpClient && ftpClient.isConnected()) {
                try {
                    ftpClient.logout();// 退出FTP服务器
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("退出FTP服务器异常!");
                    System.out.println(e.getMessage());
                } finally {
                    try {
                        ftpClient.disconnect();// 关闭FTP服务器的连接
                        System.out.println("退出并关闭FTP服务器的连接");
                    } catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("关闭FTP服务器的连接异常!");
                        System.out.println(e.getMessage());
                    }
                }
            }
        }
    }

    错误信息:

    3    [main] ERROR com.jerval.test.FtpFileList  - ERROR!
    org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
    Server Reply: SSH-2.0-OpenSSH_5.3
    	at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:333)
    	at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:290)
    	at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:396)
    	at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:796)
    	at org.apache.commons.net.SocketClient.connect(SocketClient.java:172)
    	at org.apache.commons.net.SocketClient.connect(SocketClient.java:192)
    	at com.jerval.test.FtpFileList.listFileNames(FtpFileList.java:32)
    	at com.jerval.test.FtpFileList.printList(FtpFileList.java:22)
    	at com.jerval.test.FtpFileList.main(FtpFileList.java:18)
    org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
    Server Reply: Protocol mismatch.

    解决方法:

    使用com.jcraft.jsch.JSch提供的SSH解决方法。代码如下:

    package org.jerval.test.ftp;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    import java.util.Vector;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.ChannelSftp.LsEntry;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    
    public class FtpsFileList {
        private static final Logger LOG = LoggerFactory.getLogger(FtpsFileList.class);
    
        public static void main(String[] args) {
            listFileNames("fca-vm-rds-prod1.xxx.org", 22, "applog", "xxx", "/webapp/myrds1/lib");
        }
    
        private static List<String> listFileNames(String host, int port, String username, final String password, String dir) {
            List<String> list = new ArrayList<String>();
            ChannelSftp sftp = null;
            Channel channel = null;
            Session sshSession = null;
            try {
                JSch jsch = new JSch();
                jsch.getSession(username, host, port);
                sshSession = jsch.getSession(username, host, port);
                sshSession.setPassword(password);
                Properties sshConfig = new Properties();
                sshConfig.put("StrictHostKeyChecking", "no");
                sshSession.setConfig(sshConfig);
                sshSession.connect();
                LOG.debug("Session connected!");
                channel = sshSession.openChannel("sftp");
                channel.connect();
                LOG.debug("Channel connected!");
                sftp = (ChannelSftp) channel;
                Vector<?> vector = sftp.ls(dir);
                for (Object item:vector) {
                    LsEntry entry = (LsEntry) item;
                    System.out.println(entry.getFilename());
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeChannel(sftp);
                closeChannel(channel);
                closeSession(sshSession);
            }
            return list;
        }
    
        private static void closeChannel(Channel channel) {
            if (channel != null) {
                if (channel.isConnected()) {
                    channel.disconnect();
                }
            }
        }
    
        private static void closeSession(Session session) {
            if (session != null) {
                if (session.isConnected()) {
                    session.disconnect();
                }
            }
        }
    }

    Maven依赖:

        <dependency>
          <groupId>com.jcraft</groupId>
          <artifactId>jsch</artifactId>
          <version>0.1.49</version>
        </dependency>
  • 相关阅读:
    Java知识系统回顾整理01基础02面向对象03方法
    可插件化拓展改造器 slot-maven-plugin
    数据治理框架
    Java读写hdfs上的avro文件
    FTPClient的使用
    Java读写hdfs上的avro文件
    图片上传预览
    css hack 用法注意
    获取get请求后面的参数
    js全局变量污染
  • 原文地址:https://www.cnblogs.com/muliu/p/6126126.html
Copyright © 2011-2022 走看看