解决:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3
Posted 牧野流冰87
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决: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>
以上是关于解决:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3的主要内容,如果未能解决你的问题,请参考以下文章
随笔记录2 layui-table 渲染报错 Could not parse as expression: "
警告: Settings: Could not parse struts.locale setting, substituting default VM locale
DateTimeParseException could not be parsed at index 0
DateTimeParseException could not be parsed at index 0
Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/mapp