jsch ChannelExec和ChannelShell之间的确切区别是什么?
有人能告诉我ChannelExec
和ChannelShell
之间的区别吗?
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