jsch ChannelExec和ChannelShell之间的确切区别是什么?

时间:2011-06-07 12:40:29

标签: java ssh jsch

有人可以告诉我ChannelExec&之间的区别吗? ChannelShell

3 个答案:

答案 0 :(得分:16)

The shell and exec channels非常相似 - 都使用远程shell执行命令(至少在概念上 - 服务器可能配置为以不同方式对待它们)。 RFC 4254将它们分组在section "Interactive Sessions"中,它们(以及子系统,见下文)在SSH协议中使用通道类型“session”。

有一个重要区别:

  • 对于ChannelShell,输入流提供这些命令的命令和输入。这类似于本地计算机上的使用交互式shell 。 (它通常仅用于此:交互式使用。)

  • 对于ChannelExec,命令在connect()之前使用setCommand()给出,输入流将作为输入转发给这些命令。 (大多数情况下,您只有一个命令,但您可以使用常规shell分隔符&&&|||,{{1}提供多个命令},换行符和复合命令。)这就像在本地计算机上执行执行shell脚本一样。 (当然,如果其中一个命令本身是交互式shell,则其行为类似于;。)

  • 还有第三个类似的ChannelSubsystem,它执行ssh服务器的子系统 - 这里服务器的配置决定做什么,而不是远程用户的shell。 (最常用的子系统是ChannelShell,但为此,JSch提供了一个专门的通道,它可以理解协议。)

请注意,我称之为“输入流”的是从本地到远程主机的通道中的数据流 - 实际上可以通过将Java InputStream传递给sftp方法来完成,或者通过从setInputStream方法获取Java OutputStream并写入它。

答案 1 :(得分:1)

exec通道和shell通道之间还有一个更重要的区别:shell通道将建立shell环境,例如环境变量,而exec通道则不会。

答案 2 :(得分:-1)

Exec频道仅支持Kch命令,例如ls -l。如果您将尝试运行任何shell作业,则会抛出错误,例如ksh: run_pass: not found