谁能告诉我ChannelExec
和ChannelShell
之间的区别?
最佳答案
The shell and exec channels非常相似——两者都使用远程 shell 执行命令(至少,在概念上——当然,服务器可能被配置为以不同方式对待它们)。 RFC 4254 将它们分组在 section "Interactive Sessions" 中,它们都(以及子系统,见下文)在 SSH 协议(protocol)中使用 channel 类型“ session ”。
有一个重要区别:
ChannelShell
,输入流提供命令和这些命令的输入。这就像在您的本地计算机上使用交互式 shell。 (它通常仅用于此目的:交互式使用。)ChannelExec
,命令在connect()
之前用 setCommand() 给出,输入流将作为输入转发给这些命令。 (大多数情况下,您只有一个命令,但您可以使用普通的 shell 分隔符&
、&&
、|
、||
、;
、换行符和复合命令。)这就像在本地计算机上执行 shell 脚本。 (当然,如果其中一个命令本身是一个交互式 shell,它的行为将类似于ChannelShell
。)还有第三个类似的,
ChannelSubsystem
,它执行 ssh 服务器的子系统 - 这里服务器的配置决定要做什么,而不是远程用户的 shell。 (最常用的子系统是sftp
,但为此 JSch 提供了一个专门的 channel ,它理解协议(protocol)。)
请注意,我在这里所说的“输入流”是 channel 中从本地到远程主机的数据流——这实际上可以通过将 Java InputStream 传递给 setInputStream
来完成方法,或者通过从 getOutputStream
方法获取 Java OutputStream 并写入它。
关于java - jsch ChannelExec 和 ChannelShell 之间的确切区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265278/