- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过我的 Java 代码建立 SSH 连接,但遇到异常。我通过 Putty/Winscp 工具测试了我的连接,它工作正常。问题出在我的 Java 代码上......
SEVERE: The Transport Protocol thread failed
java.io.IOException: The socket is EOF
at com.sshtools.j2ssh.transport.TransportProtocolInputStream.readBufferedData(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolInputStream.readMessage(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.readMessage(Unknown Source)
at com.sshtools.j2ssh.transport.kex.DhGroup1Sha1.performClientExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolClient.performKeyExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.beginKeyExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.onMsgKexInit(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.startBinaryPacketProtocol(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
下面是我建立连接的一段Java代码
public class MySSHClient {
static SshClient ssh = null;
static SshConnectionProperties properties = null;
SessionChannelClient session = null;
private static void MySSHClient(String hostName, String userName, String passwd )
{
try
{
// Make a client connection
ssh = new SshClient();
properties = new SshConnectionProperties();
properties.setHost("192.168.1.175");
// Connect to the host
ssh.connect(properties, new IgnoreHostKeyVerification());
// Create a password authentication instance
PasswordAuthenticationClient pwd = new PasswordAuthenticationClient();
pwd.setUsername("root");
pwd.setPassword("123456");
// Try the authentication
int result = ssh.authenticate(pwd);
// Evaluate the result
if (result==AuthenticationProtocolState.COMPLETE) {
System.out.println("Connection Authenticated");
}
}
catch(Exception e)
{
System.out.println("Exception : " + e.getMessage());
}
}//end of method.
public String execCmd(String cmd)
{
String theOutput = "";
try
{
// The connection is authenticated we can now do some real work!
session = ssh.openSessionChannel();
if ( session.executeCommand(cmd) )
{
IOStreamConnector output = new IOStreamConnector();
java.io.ByteArrayOutputStream bos = new
java.io.ByteArrayOutputStream();
output.connect(session.getInputStream(), bos );
session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
theOutput = bos.toString();
}
//else
//throw Exception("Failed to execute command : " + cmd);
//System.out.println("Failed to execute command : " + cmd);
}
catch(Exception e)
{
System.out.println("Exception : " + e.getMessage());
}
return theOutput;
}
public static void main(String[] args){
MySSHClient(null, null, null);
}
最佳答案
我在调查问题 java.io.IOException: The socket is EOF
中的错误时偶然发现了这个问题和答案。因为在我的情况下无法立即更改代码以使用其他一些 SSH Java 库,而且 @a3.14_Infinity 的说明对我来说不够详细,所以我想补充一下我的看法。
因为这个异常不是很有帮助,所以我首先尝试了Wireshark看看电线上发生了什么,但无济于事。所以我配置了 sshd_config
(OpenSSH 6.9) 以登录 DEBUG3
级别并在 /var/log/auth.log
文件中得到了答案我的测试机。它在尝试与 SSH 客户端(Java SSH 库)协商 key 交换算法时报告了一个 fatal error 。
由于 SSH 服务器和客户端无法就相互 key 交换算法达成一致,OpenSSH 服务器终止了与客户端的连接。结果,Java SSH 库代码抛出异常。
sshtools.j2ssh
( sshtools : j2ssh-core : 0.2.9 ) 库代码很旧并且已停产。以 OpenSSH 6.7 开头(2014 年 10 月发布)默认密码和 MAC 已更改以删除不安全的算法,其中包括 blowfish-cbc
密码。和 OpenSSH 6.9 (2015 年 6 月发布)默认禁用对 1024 位 diffie-hellman-group1-sha1
key 交换的支持。
当您仍然使用史前 SSH 工具 j2ssh
库(上帝保佑)连接到较新的 OpenSSH 服务器时,您将收到所描述的错误。该库代码仅向 OpenSSH 服务器提供 diffie-hellman-group1-sha1
key 交换算法,默认情况下不支持该算法。因此,无法建立安全连接。
如果不能立即转移到另一个 Java SSH 库(我的情况),那么您可以在 OpenSSH 的服务器配置文件中重新启用已禁用的 diffie-hellman-group1-sha1
key 交换算法 sshd_config
。例如像这样。
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,blowfish-cbc
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
但让我澄清一下。 diffie-hellman-group1-sha1
key 交换算法以及 blowfish-cbc
密码默认情况下处于关闭状态,因为它们不安全。在您可以替换这个过时的 Java SSH 库之前,重新启用它们应该只是一个临时措施。
最后,我想指出其他答案中建议的 Java 安全通道 (JSch) 库已停止使用。因此,您可能需要考虑 sshj甚至 ssh2j-maverick相反。
编辑:我错了,Java 安全通道 JSch 库还活着(JSCH 0.1.54 于 2016-09-03 on MavenCentral 发布),当然值得您考虑。或者,您可能还想考虑 sshj或 ssh2j-maverick .
为了尽量减少 sshtools.j2ssh
( sshtools : j2ssh-core : 0.2.9 ) 库的迁移工作,我查看了commercial 遗留 SSH 客户端库来自 SSHTOOLS (版本 1.7.1)。这允许保留现有的库集成代码,对库 API 和异常处理进行少量更改。因此,如果您不想从头开始,那么硬着头皮坚持使用 SSHTOOLS 可能是您的最佳选择。最后,为了评估迁移工作,我首先用 SSHTOOLS 的开源库替换了库 ssh2j-maverick其最新商业版本(版本 1.7.1)几乎具有相同的 API。
关于java - "The Transport Protocol thread failed"– "The socket is EOF"使用 Java 与 J2SSH 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35307393/
基于 socket.io 的官方网站 http://socket.io/#how-to-use , 我找不到任何术语。socket.emit 、 socket.on 和 socket.send 之间有
我正在使用 lua-socket 3.0rc1.3(Ubuntu Trusty 附带)和 lua 5.1。我正在尝试监听 unix 域套接字,我能找到的唯一示例代码是 this -- send std
这两者有什么区别? 我注意到如果我在一个工作程序中从 socket.emit 更改为 socket.send ,服务器无法接收到消息,虽然我不明白为什么。 我还注意到,在我的程序中,如果我从 sock
使用套接字在两台服务器之间发送数据是个好主意,还是应该使用 MQ 之类的东西来移动数据。 我的问题:套接字是否可靠,如果我只需要一次/有保证的数据传输? 还有其他解决方案吗? 谢谢。 最佳答案 套接字
引自 this socket tutorial : Sockets come in two primary flavors. An active socket is connected to a
我已经安装了在端口81上运行的流服务器“Lighttpd”(light-tpd)。 我有一个C程序,它使用套接字api创建的服务器套接字在端口80上监听http请求。 我希望从客户端收到端口80上的请
这是我正在尝试做的事情: 当有新消息可用时,服务器会将消息发送给已连接的客户端。另一方面,客户端在连接时尝试使用send()向服务器发送消息,然后使用recv()接收消息,此后,客户端调用close(
如何将消息发送到动态 session 室,以及当服务器收到该消息时,如何将该消息发送到其他成员所在的同一个 session 室? table_id是房间,它将动态设置。 客户: var table_i
这是我尝试但不起作用的方法。我可以将传入的消息从WebSocket连接转发到NetSocket,但是只有NetSocket收到的第一个消息才到达WebSocket后面的客户端。 const WebSo
我正在实现使用boost将xml发送到客户端的服务器。我面临的问题是缓冲区不会立即发送并累积到一个点,然后发送整个内容。这在我的客户端造成了一个问题,当它解析xml时,它可能具有不完整的xml标记(不
尝试使用Nginx代理Gunicorn套接字。 /etc/systemd/system/gunicorn.service文件 [Unit] Description=gunicorn daemon Af
我正在使用Lua套接字和TCP制作像聊天客户端和服务器这样的IRC。我要弄清楚的主要事情是如何使客户端和服务器监听消息并同时发送它们。由于在服务器上执行socket:accept()时,它将暂停程序,
我看了一下ZMQ PUSH/PULL套接字,尽管我非常喜欢简单性(特别是与我现在正在通过UDP套接字在系统中实现的自定义碎片/ack相比),但我还是希望有自定义负载平衡功能,而不是幼稚的回合-robi
我正在编写一个应用程序,其中有多个 socket.io 自定义事件,并且所有工作正常,除了这个: socket.on("incomingImg", function(data) {
在我的应用程序中,我向服务器发送了两条小消息(类似 memcached 的服务)。在类似 Python 的伪代码中,这看起来像: sock.send("add some-key 0") ignored
很抱歉再次发布此问题,但大多数相关帖子都没有回答我的问题。我在使用 socket.io 的多个连接时遇到问题我没有使用“socket.socket.connect”方法,但我从第一次连接中得到了反馈。
我尝试使用 socket.io 客户端连接到非 socket.io websocket 服务器。但我做不到。我正在尝试像这样连接到套接字服务器: var socket = io.connect('ws
我遇到了一个奇怪的问题。在我非常基本的服务器中,我有: server.listen(8001); io.listen(server); var sockets = io.sockets; 不幸的是,套
我正在使用带套接字 io 的sailsjs。帆的版本是 0.10.5。我有以下套接字客户端进行测试: var socketIOClient = require('socket.io-client');
这个问题在这里已经有了答案: What is the fundamental difference between WebSockets and pure TCP? (4 个答案) 关闭 4 年前。
我是一名优秀的程序员,十分优秀!