发布
社区首页 >问答首页 >很难保持JSCH会话的存活

很难保持JSCH会话的存活
EN

Stack Overflow用户
提问于 2022-10-13 09:33:37
回答 1查看 64关注 0票数 0

我试图使用JSCH和SSH在CSICO路由器上运行一系列命令。但是我遇到的问题是在执行第一个命令之后,第二个命令没有执行。在运行第一个命令之后,会话似乎就停止了。它抛出此异常:

代码语言:javascript
代码运行次数:0
复制
com.jcraft.jsch.JSchException: Packet corrupt
    at com.jcraft.jsch.Session.start_discard(Session.java:1067)
    at com.jcraft.jsch.Session.read(Session.java:937)
    at com.jcraft.jsch.Session.connect(Session.java:309)
    at com.jcraft.jsch.Session.connect(Session.java:183)
    at com.att.ncaas.device.connection.ssh.SSHConnectionJSch.connect(SSHConnectionJSch.java:120)

代码如下所示:

代码语言:javascript
代码运行次数:0
复制
public void connect () {

    ChannelExec channelExec = null;
    JSch jSch = new JSch();
    Session session = null;

    try {

        session = jSch.getSession(userid, ipAddress, port);

        // Set the password.
        session.setPassword("XXXXXXXXX");

        Properties properties = new Properties();

        properties.put("StrictHostKeyChecking", "no");

        // Set the Ciphers.
        /*
         * properties.put("cipher.s2c", "aes128-cbc"); properties.put("cipher.c2s",
         * "aes128-cbc"); properties.put("CheckCiphers", "aes128-cbc");
         */

        session.setConfig(properties);

        // Finally make the connection.
        session.connect();

        channelExec = (ChannelExec) session.openChannel("exec");

        // Command 1
        channelExec.setCommand("show run");

        ByteArrayOutputStream responseStream = new ByteArrayOutputStream();

        channelExec.setOutputStream(responseStream);

        channelExec.connect();

        while (channelExec.isConnected()) {
            Thread.sleep(1000);
        }

        String responseString = new String(responseStream.toByteArray());

        System.out.println("Show Run Output:\n");
        System.out.println(responseString);

        if (session.isConnected()) {
            System.out.println("Wooooooooooooooooooohoooooooooooooooooooooooo!!!!");
        } else {
            session.connect();
        }

        // Command 2
        channelExec.setCommand("show version");

        channelExec.connect();

        while (channelExec.isConnected()) {
            Thread.sleep(1000);
        }

        responseString = new String(responseStream.toByteArray());

        System.out.println("Show Version Output:\n");
        System.out.println(responseString);

    } catch (JSchException e) {

        e.printStackTrace();

    } catch (InterruptedException e) {

        e.printStackTrace();

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        if (session != null) {
            session.disconnect();
        }

        if (channelExec != null) {
            channelExec.disconnect();
        }
    }
}

当它用于if块中的第二个if时,它会抛出错误。我注意到的另一件事是,当我把密码放进去的时候,这部分:

代码语言:javascript
代码运行次数:0
复制
// Set the Ciphers.
properties.put("cipher.s2c", "aes128-cbc");
properties.put("cipher.c2s", "aes128-cbc");
properties.put("CheckCiphers", "aes128-cbc");

在同一条线上我得到了一个不同的错误。我得到:

代码语言:javascript
代码运行次数:0
复制
com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
    at com.jcraft.jsch.Session.connect(Session.java:565)
    at com.jcraft.jsch.Session.connect(Session.java:183)

任何关于如何使会话在两个ChannelExec执行之间保持活动的指针都会非常有用。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 10:00:37

首先,不能以这种方式重用"exec“通道。您必须为新命令打开一个新通道。

请注意,众所周知,Cisco不支持一个"exec“通道中的多个命令,即使预先指定了多个命令:

Error passing multiple commands to Cisco CLI via plink

如果它不支持一个连接中的多个"exec“通道,我也不会感到惊讶。

您是否使用SSH客户端进行测试(如果可能的话)来执行您正在尝试实现的操作?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74053535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档