【发布时间】:2021-06-15 17:09:24
【问题描述】:
请分享您对我们如何解决此异常的想法
我们正在开发基于 SSH 的 Netconf,使用的 SSH 库是 Apache Mina 和 SSHD。 Device 是 Netconf 服务器,Application 是 Netconf 客户端。由于设备位于防火墙后面,应用程序无法连接到设备,但设备可以连接到应用程序。因此,我们正在使用设备建立的会话与应用程序进行所有通信。
以下是遵循的步骤:
-
启动 NioSocketAcceptor 监听/绑定到一个端口号
-
IoSessionConfig 的 useReadoperation 属性设置为 true
-
当一个 tcp 连接被接受时,我们有一个可用的 mina core IoSession,这里我们称之为 tcpSession。
-
我们想使用这个 mina IoSession 来读取和写入 netconf 消息。用于将mina核心会话转换为ssdh IoSession的代码如下
新的 org.apache.sshd.common.io.IoSession() {
@Override public long getId() { return tcpSession.getId(); } @Override public Object getAttribute(final Object key) { return tcpSession.getAttribute(key); } @Override public Object setAttribute(final Object key, final Object value) { return tcpSession.getAttribute(key, value); } @Override public SocketAddress getRemoteAddress() { return tcpSession.getRemoteAddress(); } @Override public SocketAddress getLocalAddress() { return tcpSession.getLocalAddress(); } @Override public IoWriteFuture write(final Buffer buffer) { final ChannelAsyncOutputStream.IoWriteFutureImpl ioWriteFuture = new ChannelAsyncOutputStream.IoWriteFutureImpl(buffer); byte[] bytes = buffer.getCompactData(); int capacity = bytes.length + 8; IoBuffer bytebuffer = IoBuffer.allocate(capacity).setAutoExpand(true); //bytebuffer.putInt(bytes.length); bytebuffer.put(bytes); bytebuffer.flip(); buffer.clear(); final WriteFuture write = tcpSession.write(bytebuffer); write.addListener(new IoFutureListener<WriteFuture>() { @Override public void operationComplete(final WriteFuture future) { if (future.isWritten()) { ioWriteFuture.setValue(true); } else { // TODO check the value type expected + if exception can go there ioWriteFuture.setValue(future.getException()); } } }); return ioWriteFuture; } @Override public CloseFuture close(final boolean immediately) { final DefaultCloseFuture defaultCloseFuture = new DefaultCloseFuture(null); tcpSession.close(immediately).addListener(new IoFutureListener<org.apache.mina.core.future.CloseFuture>() { @Override public void operationComplete(final org.apache.mina.core.future.CloseFuture future) { if(future.isClosed()) { defaultCloseFuture.setValue(true); } else { // TODO check the value type expected defaultCloseFuture.setValue(false); } } }); return defaultCloseFuture; } @Override public IoService getService() { throw new UnsupportedOperationException("No service available"); } @Override public boolean isClosed() { return tcpSession.getCloseFuture().isClosed(); } @Override public boolean isClosing() { return tcpSession.isClosing(); } }); -
用于将 Apache SSHD IoSession 附加到客户端的代码如下
final ConnectFuture connectFuture = new DefaultConnectFuture(null); ClientSessionImpl 会话 = null; 尝试 { session = new ClientSessionImpl(sshClient, ioSession); AbstractSession.attachSession(ioSession, session); MyAsyncSshHandlerReader async = new MyAsyncSshHandlerReader(ioSession); } 捕捉(异常 e){ // TODO 自动生成的 catch 块 e.printStackTrace(); }
-
MyAsyncSshHandlerReader 是用于从 tcpSession 读取数据的类。
类 MyAsyncSshHandlerReader 实现 IoFutureListener、AutoCloseable {
private final org.apache.sshd.common.io.IoSession ioSession; public MyAsyncSshHandlerReader(org.apache.sshd.common.io.IoSession ioSession) { this.ioSession = ioSession; minaCoreIoSession.read().addListener(this); } @Override public void close() throws Exception { // TODO Auto-generated method stub } @Override public void operationComplete(ReadFuture future) { long msgsRead = future.getSession().getReadMessages(); if(future.isRead() && !future.isClosed()){ IoBuffer msg = (IoBuffer)future.getMessage(); msg.flip(); Buffer buf = new Buffer(msg.array()); try { if(AbstractSession.getSession(ioSession) != null){ AbstractSession.getSession(ioSession).messageReceived(buf); } } catch (Exception e) { e.printStackTrace(); } minaCoreIoSession.read().addListener(this); } }}
-
在应用程序端创建客户端会话时,会调用以下方法。
- 发送标识
- sendKexInit()
-
应用程序还收到了从设备交换的识别消息和密钥 并且识别消息被正确读取但无法解码密钥交换消息,library has throwed SshException "invalid packet length 0"
2015-11-02 13:02:48,831 |信息 | oupCloseable-6-2 | ClientSessionImpl | 210 - org.apache.sshd.core - 0.14.0 |解码包错误(长度无效) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 fc 07 14 34 2 4 7 4e 4b 7e 2e e3 55 27 ef 00 00 00 b7 65 63 64 68 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36 2c 65 63 64 68 2d 73 68 61 32 2d 6e 69 3 8 74 70 6 56 36 74 70 6 33 2d 73 68 61 32 2d 6e 69 74 74 70 35 32 32 31 2C 64 69 69 66 66 66 69 69 69 65 2d 68 68 6c 6c 6c 6c 6c 6c 6 d 61 d 6 e 61 6 e 2d 67 72 6f 75 75 70 2d 70 2d 65 78 63 61 61 61 61 61 61 61 67 67 67 65 2d 73 68 68 68 68 61 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 2C 64 69 66 66 69 69 65 2D 68 68 6C 6C 6C 6D 6D 61 61 6E 2D 67 72 6F 75 75 70 2D 65 78 65 78 63 68 68 61 61 67 67 67 67 65 2D 73 68 61 313 61 31 31 31 2C 64 69 66 66 66 66 66 69 69 65 2D 65 65 65 65 6C 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D时6e 2d 67 72 6f 75 70 31 34 2d 73 68 61 31 2c 64 69 66org.apache.sshd.common.SshException:无效的数据包长度:0
在 org.apache.sshd.common.session.AbstractSession.decode(AbstractSession.java:719)
在 org.apache.sshd.common.session.AbstractSession.messageReceived(AbstractSession.java:308)
在 org.opendaylight.controller.netconf.nettyutil.handler.ssh.client.ReversedAsyncSshHandler$MyAsyncSshHandlerReader.operationComplete(ReversedAsyncSshHandler.java:220)
- 请说明 AbstractSession.decode() 方法的工作原理
根据我的调试,rpos 和 limit 变量保持相同的值,例如 1536。我的阅读方式有问题吗?
【问题讨论】:
标签: sshd apache-mina