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

有人能告诉我ChannelExecChannelShell之间的区别吗?

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

有一个重要的区别:

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

  • 对于ChannelExec ,在connect()之前使用setCommand()给出命令,输入流将作为输入发送到这些命令。 (通常,您只有一个命令,但是您可以使用普通的shell分隔符&&&|||; ,换行符和复合命令提供多个命令。)这就像在本地执行shell脚本一样电脑。 (当然,如果其中一个命令本身是一个交互式shell,那么它的行为就像一个ChannelShell 。)

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

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

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