基本上,我有一个java程序,它使用JSch SSH库来控制两个不同的SSH连接。
我创建了一个名为SSHConnection的类,它是JSch库的包装器,我通过调用下面显示的构造函数初始化了两个副本:
public SSHConnection(String username,String password,String host, String knownHosts,int portNumber)抛出JSchException {
JSch jsch = new JSch(); jsch.setKnownHosts(knownHosts); this.session = jsch.getSession(username,host,portNumber); this.session.setPassword(password); this.session.connect();
}
现在,在SSHConnection类中,为了创建shell通道,我使用以下命令:
shell =(ChannelShell)this.session.openChannel(" shell");
但是,我发现如果我已经打开一个使用SHELL频道的会话,我会收到一条错误消息"频道未打开" (JSch Exception)当我尝试打开第二个会话的第一个频道时。
有没有办法可以一次打开两个Shell频道?这是我的问题,JSch问题还是SSH问题?
编辑::::
我可以从多个终端同时连接到SSH服务器。例如,在一个终端,我可以做...
ssh asofjpasf @ myserver
在另一个终端我能做到...... ssh opapaos @ myserver
但是,当我尝试使用JSch制作单个程序具有相同的行为时,当我尝试打开第二个shell通道时,它无法说明通道未打开。
答案 0 :(得分:1)
我可以一次打开两个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])))))))
因此,无论哪种情况都可以正常工作。