“会话”与“通道”(JSch 和 sshd)

Posted

技术标签:

【中文标题】“会话”与“通道”(JSch 和 sshd)【英文标题】:"Session" vs "Channel" (JSch and sshd) 【发布时间】:2012-04-02 06:39:16 【问题描述】:

我希望使用 JSch 将小文件(在未知时间和未知数量)从一台服务器移动到另一台服务器 - 不幸的是,我试图为每次传输打开一个会话,这很快就被炸毁了(我猜是 MaxSessions 10?)。

然后我用 JSch 打开了一个会话(每个主机),并为每个操作创建了一个通道(单个发送将创建一个通道,放置文件,关闭通道),但我遇到了同样的事情(尝试时一次做 10 个或更多,我会被拒绝连接,因为当另一个请求通过时某些通道仍在关闭)。

所以我查看了 sshd_config 并发现他们有一个 MaxSessions 属性,这在这里非常有用 - 但它让我想知道,是否没有 MaxChannelsPerSession 属性,或者我对 JSch 是什么感到困惑调用“通道”,什么是实际的 SSH 通道。

我正在使用截至 20120316 的最新版本的 JSch。

(最重要的是,我应该将它发布在网站上的不同位置吗?它是某种编程相关的,但我想也是系统管理员的一部分......)

【问题讨论】:

【参考方案1】:

我是JSch的作者。

sshd_config 上的“MaxSessions”属性将在 OpenSSH 的 sshd 上被识别为“MaxChannelsPerSession”。

【讨论】:

稍微跟进:会话/通道线程安全吗?我可以创建一个全局保存的会话(或传递的引用),然后在不同的线程中创建通道而不用担心,还是应该把它全部放在一个同步块中? @ymnk 你能看看这个吗:***.com/questions/23692643/…【参考方案2】:

只是另一种选择:

对于传输文件,JSch 提供了ChannelSftp 类。有了它,您可以只使用一个通道(对于每个服务器)一个接一个地(甚至并行地)传输多个文件。

不过,我不知道这是否会带来任何性能优势。

【讨论】:

你见过使用单个 ChannelSftp 实例并行传输文件的例子吗?我一直在努力挖掘一个。 不,我对 ChannelSftp 的了解主要是理论上的,通过阅读其代码和 SFTP pre-RFC。 离题了,但是Apache Mina SSHD 的客户有对应的吗?我使用这个而不是JSCH,我的应用程序将从可重用的通道中受益。目前,我正在为每个开销巨大的文件连接和断开连接。 @Sridhar-Sarnobat 我从来没有使用过,但是从查看文档来看,我会说DefaultSftpClient 代表来自客户端的 SFTP 通道,其用于传输的读/写方法可以可以多次使用。 啊,我明白了。我想我现有的代码已经优化过了(尽管我可能需要避免在所有级别(会话、ssh 客户端、sftp 客户端)调用停止或关闭。谢谢。

以上是关于“会话”与“通道”(JSch 和 sshd)的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSch shell 通道向服务器发送命令

JSch : channel never closed or EOF 通道未关闭

使用 JSch 的多个命令

通道单一连接(会话)到事件处理程序映射

visa打开与仪器的通信通道称为会话session

如何在整个“会话”中保持 Netty NIODatagram 通道打开