Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JSch中重用shell通道_Java_Ssh_Jsch - Fatal编程技术网

Java 如何在JSch中重用shell通道

Java 如何在JSch中重用shell通道,java,ssh,jsch,Java,Ssh,Jsch,我需要反复向某些设备发送一些命令以获得一些结果 我使用JSch连接到设备并向其发送命令,然后解析结果 我发现每次发送命令时,我都需要创建一个新通道,并且必须再等待一到两秒钟,才能销毁前一个通道,然后程序才能成功创建一个新通道 我想知道是否有任何方法可以重用shell通道?所以我不需要每次都创建一个新频道,也不需要等待前一个频道被销毁 我的代码如下: 创建会话: JSch jsch = new JSch(); session = jsch.getSession(userName, deviceIp

我需要反复向某些设备发送一些命令以获得一些结果

我使用JSch连接到设备并向其发送命令,然后解析结果

我发现每次发送命令时,我都需要创建一个新通道,并且必须再等待一到两秒钟,才能销毁前一个通道,然后程序才能成功创建一个新通道

我想知道是否有任何方法可以重用shell通道?所以我不需要每次都创建一个新频道,也不需要等待前一个频道被销毁

我的代码如下: 创建会话:

JSch jsch = new JSch();
session = jsch.getSession(userName, deviceIp, 22);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setServerAliveInterval(5000);
session.connect(60 * 1000);
创建通道(线程需要休眠约3秒,以等待前一个通道被销毁)

编辑:


  • 在解析结果后,我尝试再次向通道发送命令,但它不起作用

  • 我使用线程池向设备发送命令,因此在连接到设备后,我将会话保存到一个静态映射中,然后我可以检索到每个设备的连接


  • 您正在尝试从不同线程使用相同的通道吗?如果您打算这样做,您可能需要执行一些线程同步。从您提供的代码来看,应用程序的整体流程并不清楚。看看你是如何管理你的线程是很有用的。“线程需要睡眠大约3秒钟,等待前一个通道被破坏”——为什么?请解释。无论如何,“shell”频道不是用于自动化,而是用于实现交互式shell会话。对于自动化,使用-一旦您使用“shell”频道(现在忽略它是错误的),我根本不理解您的问题。你为什么要关上它?只需在读取以前命令的输出后发送新命令。-也许你应该向我们展示更多的代码来更好地解释你的问题。我试图在解析结果后再次向通道发送命令,但没有成功。我使用线程池向设备发送命令,因此在连接到设备后,我将会话保存到一个静态映射中,然后我可以检索到每个设备的连接。使用JSch时,在创建会话后,每次要发送命令时,都必须创建一个新通道“我试图在解析结果后再次向通道发送命令,但不起作用”-“不起作用”不是问题描述。给我们看看你的代码“当使用JSch时,在创建会话之后,每次您想要发送命令时,您都必须创建一个新的通道”-这对于“exec”通道是正确的,但是对于“shell”通道来说显然毫无意义。-你仍然没有解释“3秒”。
    Thread.sleep(3000);
    channel = (ChannelShell)session.openChannel("shell");
    ops = channel.getOutputStream();
    ps = new PrintStream(ops, true);
    channel.connect(60 * 1000);
    in = new BufferedReader(new InputStreamReader(channel.getInputStream()));
    ps.println("command-1");
    ps.println("command-2");
    while ((current = in.readLine()) != null) {
        // parse the results
    }
    // close the channel
    channel.disconnect()