java - 多个 SHELL channel JSch java SSH

标签 java ssh jsch

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

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

public SSHConnection(String username,String password,String host, String knownHosts, int portNumber) throws JSchException{

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

}

现在,在 SSHConnection 类中,为了创建 shell channel ,我使用以下命令:

shell = (ChannelShell)this.session.openChannel("shell");

但是,我发现,如果我已经打开了一个使用 SHELL channel 的 session ,当我尝试打开第二个 channel 的第一个 channel 时,我会收到一条错误消息,提示“ channel 未打开”(JSch 异常) session 。

有没有办法可以同时打开两个 Shell channel ?这是我的问题、JSch 问题还是 SSH 问题?

编辑::::

我可以从多个终端同时连接到 SSH 服务器。例如,在一个终端中我可以做...

ssh asofjpasf@myserver

在另一个终端我可以做... ssh opapaos@myserver

但是,当我尝试使用 JSch 使单个程序具有相同的行为时,当我尝试打开第二个 shell channel 时,它失败并指出 channel 未打开。

最佳答案

我可以同时打开两个 shell channel 。我见过嵌入式服务器不允许这样做,但开箱即用的 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])))))
<小时/>

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

(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])))))))

因此,这在任何一种情况下都可以正常工作。

关于java - 多个 SHELL channel JSch java SSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20559393/

相关文章:

java - servlet jsp 的 Servlet.service() 抛出异常 java.lang.IllegalStateException

mercurial - 如何通过 TortoisePlink 和 KeyRing 使受密码保护的 PPK 停止在 TortoiseHG 中询问密码

sftp - 带有session.setConfig的JSch SFTP安全性(“StrictHostKeyChecking”, “no”);

java - Apache httpd 日志中的大量 404 错误用于路径错误的静态文件

java - 这段代码的目的是什么?它只是复制一个日期吗?

php - 使用 PHP SSH 连接到远程服务器

linux - 无法通过 SSH 连接到远程服务器。错误: ssh_exchange_identification: read: Connection reset by peer

java - com.jcraft.jsch.JSchException : remote port forwarding failed for listen port 19999

java - 如何使用Java读取Unix目录中的文件?

java - 使用 java 删除给定 url 的文件