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

时间:2017-03-21 19:28:03

标签: java ssh telnet jsch

我一直在寻找一种解决方案来接受SSH连接,然后通过java与远程系统进行Telnet连接。由于只使用telnet连接,我可以在远程机器上执行该特定命令。

经过大量浏览后,我发现了这个答案" https://stackoverflow.com/questions/27146991/running-telnet-command-on-remote-ssh-session-using-jsch"但在执行" telnet localhost 4444 "程序执行挂起&永远不会从循环中走出来。因为我在接受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 4444\r\n"); after this no commands executes
    dataOut.writeBytes(command + "\r\n"); 

    dataOut.writeBytes("quit\r\n");

//使用quit我可以通过putty手动退出telnet会话,因为退出并不起作用

    dataOut.writeBytes("exit\r\n"); // 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 localhost 4444

START TRANSLATOR ABCLOC HIGH

退出

出口

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

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

逃脱角色是' ^]'。

连接到INTERFACE LAYER 心跳telnet localhost 4444

START TRANSLATOR ABCLOC HIGH

退出

出口

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

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

逃脱角色是' ^]'。

连接到INTERFACE LAYER 输入" help"获取命令列表

////此程序挂起&没有执行任何操作

1 个答案:

答案 0 :(得分:0)

我没有像你一样在端口4444上运行相同的服务器,但是我在本地测试中发现了类似的行为" telnet localhost 80"和" GET /"在JSch内。在我的情况下,修复是要小心"连接已关闭"信息。在我的情况下,服务器发送:

连接被外国主机关闭。

而您的代码正在检查

连接被外国主机关闭

(没有完全停止),所以循环永远不会终止。您可以在https://github.com/pgleghorn/JSchTest

找到我的测试代码