多个SHELL通道JSch java SSH

时间:2013-12-13 04:59:13

标签: java ssh jsch

基本上,我有一个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通道时,它无法说明通道未打开。

1 个答案:

答案 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])))))))

因此,无论哪种情况都可以正常工作。