使用 JSch 在远程 SSH 会话上运行 telnet 命令后,执行挂起



我一直在寻找一种解决方案,通过 java 进行 SSH 连接,然后进行远程登录连接到远程系统。由于仅使用 telnet 连接,我可以在远程计算机上执行该特定命令。

浏览了很多之后,我发现这个答案"https://stackoverflow.com/questions/27146991/running-telnet-command-on-remote-ssh-session-using-jsch"但是在执行">telnet localhost 4444"之后,程序执行挂起并且永远不会从while循环中出来。因此,在进行telnet连接后,我无法执行其他命令。

我的代码是:-

public static void main(String[] arg) {
try {
System.out.println(telnetConnection(command, puttyUserName,
puttyPassword, puttyHostName));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String telnetConnection(String command, String user, String password, String host)
throws JSchException, Exception {
JSch jsch = new JSch();
jsch.addIdentity(puttyPublicKey, puttyPassword);
Session session = jsch.getSession(user, host, 22);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(500);//This timeout is not working as mentioned in the example. Program execution never stops.
Channel channel = session.openChannel("shell");
channel.connect(500);
DataInputStream dataIn = new DataInputStream(channel.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(dataIn));
DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());
System.out.println("Starting telnet connection...");
dataOut.writeBytes("telnet localhost 4444rn"); after this no commands executes
dataOut.writeBytes(command + "rn"); 
dataOut.writeBytes("quitrn");

使用退出我可以退出telnet会话,同时通过腻子手动执行,因为退出不起作用

dataOut.writeBytes("exitrn"); // exit from shell
dataOut.flush();
String line = reader.readLine(); 
String result = line + "n";
while (!(line = reader.readLine()).equals("Connection closed by foreign host")) 
{
result += line + "n";
System.out.println("heart beat" + result);
}
System.out.println("after while done");
dataIn.close();
dataOut.close();
channel.disconnect();
session.disconnect();
System.out.println("done");
return result;
}

}

输出//

心跳 Telnet 本地主机 4444

启动转换器 ABCLOC 高

退出

退出

[XYZ]$ telnet localhost 4444 正在尝试 x.x.x.1...

连接到 localhost.localdomain (x.x.x.1)。

转义字符为"^]"。

连接到接口层 心跳 Telnet 本地主机 4444

启动转换器 ABCLOC 高

退出

退出

[XYZ]$ telnet localhost 4444 正在尝试 x.x.x.1...

连接到 localhost.localdomain (x.x.x.1)。

转义字符为"^]"。

连接到接口层 键入"帮助"以获取命令列表

////在此程序挂起后,不执行任何操作

我没有像您那样在端口 4444 上运行相同的服务器,但我在本地测试中发出"telnet localhost 80"和"GET/"在 JSch 中得到了类似的行为。在我的情况下,解决方法是要注意"连接已关闭"消息的准确性。就我而言,服务器发送:

连接被外部主机关闭。

而您的代码正在检查

连接被外部主机关闭

(没有句号),因此循环永远不会终止。您可以在以下位置找到我的测试代码 https://github.com/pgleghorn/JSchTest

最新更新