多SHELL通道JSch java SSH
基本上,我有一个java程序,它使用java的JSCHSSH库控制两个不同的SSH连接 我创建了自己的类SSHConnection,它是JSch库的包装器,并通过调用如下所示的构造函数初始化了两个副本: 公共SSHConnection(字符串用户名、字符串密码、字符串主机、, 字符串knownHosts,int portNumber)抛出JSchException{多SHELL通道JSch java SSH,java,ssh,jsch,Java,Ssh,Jsch,基本上,我有一个java程序,它使用java的JSCHSSH库控制两个不同的SSH连接 我创建了自己的类SSHConnection,它是JSch库的包装器,并通过调用如下所示的构造函数初始化了两个副本: 公共SSHConnection(字符串用户名、字符串密码、字符串主机、, 字符串knownHosts,int portNumber)抛出JSchException{ JSch jsch = new JSch(); jsch.setKnownHosts(knownHosts); this.s
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异常)
有没有一种方法可以同时打开两个Shell通道?这是我的问题、JSch问题还是SSH问题
编辑:::
我可以从多个终端同时连接到SSH服务器。例如,在一个终端我可以做
sshasofjpasf@myserver
在另一个终端我可以做。。。
sshopapaos@myserver
但是,当我尝试使用JSch使单个程序具有相同的行为时,当我尝试打开第二个shell通道时,它无法声明通道未打开。我能够同时打开两个shell通道。我见过不允许这样做的嵌入式服务器,但开箱即用的OpenSSH服务器应该没有问题 顺便说一句,对于我自己的测试,我正在使用CLJSH(jsch的Clojure包装器,此实现基于jsch 0.1.50构建):
…或者,使用两个单独的会话:
(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])))))))
因此,这两种情况下都能正常工作。我能够同时打开两个shell通道。我见过不允许这样做的嵌入式服务器,但开箱即用的OpenSSH服务器应该没有问题 顺便说一句,对于我自己的测试,我正在使用CLJSH(jsch的Clojure包装器,此实现基于jsch 0.1.50构建):
…或者,使用两个单独的会话:
(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])))))))
因此,无论哪种情况,这都是正确的。Hmm.如果您不使用一个会话,而是使用两个会话执行相同的操作,会发生什么情况?如中所述,每节课一个频道?@vraiment我不确定我是否理解你问题的背景。你是在问嵌入式服务器是否会禁止这样做吗?如果是这样的话,这似乎是一个非常特定于实现的问题——如果是进程内服务器,我的猜测是肯定的;如果它是一个分叉服务器,我猜不会。。。但即便如此,这也是假设一个易于实施的决定,而不是一个政策决定。我想我的编辑会把事情弄清楚的,谢谢你的提问。基本上,我可以运行多个SSH会话,每个会话都有一个SHELL通道打开,只是不在同一个程序中。@vraiment更新后提供了一个同样有效的示例……顺便说一句,我在这里给出的代码是一个完整的复制程序。您提供SSCCE不会有任何伤害(请参阅);虽然在Java中这样做会更加冗长,但除非提供足够的上下文来产生问题,否则无法诊断问题。如果你不开一节课,而是开两节课做同样的事情,会发生什么?如中所述,每节课一个频道?@vraiment我不确定我是否理解你问题的背景。你是在问嵌入式服务器是否会禁止这样做吗?如果是这样的话,这似乎是一个非常特定于实现的问题——如果是进程内服务器,我的猜测是肯定的;如果它是一个分叉服务器,我猜不会。。。但即便如此,这也是假设一个易于实施的决定,而不是一个政策决定。我想我的编辑会把事情弄清楚的,谢谢你的提问。基本上,我可以运行多个SSH会话,每个会话都有一个SHELL通道打开,只是不在同一个程序中。@vraiment更新后提供了一个同样有效的示例……顺便说一句,我在这里给出的代码是一个完整的复制程序。您提供SSCCE不会有任何伤害(请参阅);尽管在Java中这样做会更加冗长,但除非提供足够的上下文来产生问题,否则无法诊断问题。仅供参考,您也可以使用命令行SSH客户端在同一传输上测试运行两个会话——请参阅《供参考》中记录的ControlMaster、ControlPath和相关选项,您也可以使用命令行SSH客户端在同一个传输上测试运行两个会话——请参阅中记录的ControlMaster、ControlPath和相关选项