基本上,我有一个 java 程序,它使用 Java 的 JSch SSH 库控制两个不同的 SSH 连接。
我创建了自己的名为 SSHConnection 的类,它是 JSch 库的包装器,并通过调用如下所示的构造函数来初始化两个副本:
block 引用>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 ,我使用以下命令:
block 引用>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/