当前位置: 首页 > 知识库问答 >
问题:

多个SHELL通道JSch java SSH

单于山
2023-03-14

基本上,我有一个java程序,它使用JSch SSH库来控制两个不同的SSH连接。

我创建了一个名为SSHConnection的类,它是JSch库的包装器,并通过调用如下所示的构造函数初始化了两个副本:

 JSch jsch = new JSch();
 jsch.setKnownHosts(knownHosts);
 this.session = jsch.getSession(username,host,portNumber);
 this.session.setPassword(password);
 this.session.connect();

但是,我发现,如果我已经打开了一个使用SHELL通道的会话,当我试图为第二个会话打开第一个通道时,我会得到一个错误,即“channel is not opened”(JSch异常)。

有没有一种方法我可以同时打开两个壳通道?这是我的问题、JSch问题还是SSH问题?

编辑::::

共有1个答案

殳凯捷
2023-03-14

我可以同时打开两个shell通道。我见过嵌入式服务器不允许这样做,但开箱即用的OpenSSH服务器应该不会有问题。

顺便说一句,对于我自己的测试,我使用的是clj-ssh(一个用于jsch的Clojure包装器,这个实现是针对jsch 0.1.50构建的):

(ns ssh-test.core
  (:use [clj-ssh.ssh]))

(defn test-conn []
  (let [agent (ssh-agent {})]
    (let [session (session agent "127.0.0.1" {:strict-host-key-checking :no})]
      (with-connection session
        (let [ch-a (shell-channel session)
              ch-b (shell-channel session)]
          [ch-a ch-b])))))

...或者,使用两个单独的会话:

(defn test-conn []
  (let [agent (ssh-agent {})]
    (let [session-a (session agent "127.0.0.1" {:strict-host-key-checking :no})
          session-b (session agent "127.0.0.1" {:strict-host-key-checking :no})]
      (with-connection session-a
        (let [ch-a (shell-channel session-a)]
          (with-connection session-b
            (let [ch-b (shell-channel session-b)]
              [ch-a ch-b])))))))

因此,这在任何一种情况下都是正确的。

 类似资料:
  • 我是新来的,想知道一些很基本的问题,我不能弄清楚。 为了发挥作用(对实际需要的抽象),我需要: 用常数固定的元素初始化字符串片断 遍历此切片并为每个元素运行一个goroutine 每个goroutine将花费一定的时间来处理元素(随机秒持续时间) 作业完成后,我希望goroutine将结果推送到一个通道 然后我需要捕获来自这个通道的所有结果(在一个从主goroutine调用的函数中),将它们附加到

  • 问题内容: 我设法用Jsch通过ssh执行了一条命令,但是当我尝试执行第二条命令时却失败了 为了调试,我将此问题归结为以下几行: 这主要是官方的Exec示例,但这给了我以下输出: 第一个命令成功执行,第二个则没有成功。 有任何想法吗 ? 问题答案: 嘿,jsch和Ubuntu完全一样。(如何)解决了?为每个执行执行新会话会浪费太多时间?此刻,我捕获了jsch异常并搜索“会话未关闭”,然后我重新连接

  • 前面两节里我们用到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是$h$和$w$(像素),那么它可以表示为一个$3\times h\times w$的多维数组。我们将大小为3的这一维称为通道(channel)维。本节我们将介绍含多个输入通道或多个输出通道的卷积核。 多输入通道 当输入数据含多个通道时

  • 问题内容: 我需要使用单个任务队列和单个结果队列来启动许多工作程序。每个工人都应该以不同的goroutine开始。我需要等到所有工作人员都将完成并且任务队列将为空后再退出程序。我已经准备了goroutine同步的小例子。主要思想是我们将排队的任务计数,并等待所有工人完成工作。但是当前的实现有时会遗漏值。为什么会发生这种情况以及如何解决问题?示例代码: 问题答案: 使用sync.WaitGroup等

  • 问题内容: 我希望能够将Java应用程序中以字符串表示的许多连续命令发送到SSH服务器以执行。我应该使用: -要么- 问题答案: 使用shell通道启动外壳(在Unix上为sh或bash或类似的东西,在Windows上通常为cmd.exe)并创建控制台(如果在本地运行它们,则在屏幕上看到的内容)。您有一个提示,您可以将其解析或用于检测命令是否完成。 使用命令通道,将为每个命令启动一个shell实例

  • 问题内容: 我有多个goroutine试图同时在同一频道上接收。似乎最后一个在通道上开始接收的goroutine获得了值。这是语言规范中的某个地方,还是未定义的行为? 输出: 操场上的例子 编辑: 我只是意识到它比我想的还要复杂。该消息在所有goroutine中传递。 输出: 操场上的例子 问题答案: 是的,它很复杂,但是有一些经验法则可以使事情变得简单得多。 宁愿使用 传递给go-routine