Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多SHELL通道JSch java SSH_Java_Ssh_Jsch - Fatal编程技术网

多SHELL通道JSch java SSH

多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

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

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

公共SSHConnection(字符串用户名、字符串密码、字符串主机、, 字符串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异常)

有没有一种方法可以同时打开两个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和相关选项