ChannelExec
有人能告诉我&之间的区别ChannelShell
吗?
3 回答
shell 和 exec 通道非常相似——都使用远程 shell 执行命令(至少在概念上——当然,服务器可能被配置为以不同的方式对待它们)。RFC 4254 将它们分组在“交互式会话”部分中,并且它们(以及子系统,见下文)都使用 SSH 协议中的通道类型“会话”。
有一个重要的区别:
对于
ChannelShell
,输入流提供命令和这些命令的输入。这就像在本地计算机上使用交互式 shell 。(通常仅用于此目的:交互式使用。)对于
ChannelExec
,命令是在 setCommand() 之前给出connect()
的,输入流将作为输入转发给这些命令。(大多数情况下,您只有一个命令,但您可以使用普通的 shell 分隔符&
、&&
、|
、||
、;
、 换行符和复合命令提供多个命令。)这就像在本地计算机上执行 shell 脚本一样。(当然,如果其中一个命令本身是交互式 shell,则其行为类似于ChannelShell
.)还有第三个类似的,
ChannelSubsystem
,它执行 ssh 服务器的子系统 - 这里服务器的配置决定做什么,而不是远程用户的 shell。(最常用的子系统是sftp
,但是JSch为此提供了一个专门的通道,它可以理解协议。)
请注意,我在这里所说的“输入流”是通道中从本地到远程主机的数据流——实际上可以通过将 Java InputStream 传递给方法或从方法setInputStream
中获取 Java OutputStream 来完成getOutputStream
并写信给它。
exec 通道和 shell 通道还有一个更重要的区别:shell 通道会建立 shell 环境,例如环境变量,而 exec 通道不会。
Exec 通道将仅支持 Kch 命令,例如ls -l
. 如果您尝试运行任何 shell 作业,它将引发错误,例如ksh: run_pass: not found