有人可以告诉我ChannelExec
&之间的区别吗? ChannelShell
?
答案 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