JSch中的“shell”通道和“exec”通道有什么区别

2022-09-01 11:47:50

我希望能够将 Java 应用程序中表示为字符串的许多连续命令发送到 SSH 服务器执行。我应该使用:

Channel channel = session.openChannel("shell");

- 或 -

Channel channel = session.openChannel("exec");

答案 1

有关这些流之间的差异和相似之处的概述,您可以在JSch wiki中的»Shell,Exec或SwisWi Channel«中找到。以下是您的使用案例的一些详细信息。

exec 通道中,命令来自您使用 .SSH 服务器会立即将它们传递到 shell(使用类似的东西)。setCommand()bash -c '<command>'

如果 shell 由于某种原因之前没有以某种方式退出,它们都将被执行。(如果需要,您可以在此处发送一个完整的shell脚本,该脚本使用和类似地实现一些逻辑。if

因此,要执行多个命令,可以通过用换行符 () 分隔它们来将它们传递到 exec 通道。由于您无法在给出所有命令之前等待结果,因此在这里您只能使用多个exec通道(但是当每个通道生成一个新的shell时,它们不会保存它们之间的状态,例如工作目录或shell变量)。;\n

shell 通道中,shell 将从流中读取输入,并将第一行解释为命令(或多个命令)。

然后它将执行此命令。如果需要,命令本身可能会从流中读取更多输入。

然后,shell 将读取下一行,将其解释为命令,然后执行。

(在某些情况下,shell 必须读取多行,例如长字符串或组合命令,如 if 或循环。

这将持续到流的结束(例如,stream.close()在你这边)或执行显式的exit命令。

如果您不通过通道输入/输出流向 shell 发送任何输入,则 shell 将简单地等到您发送更多或关闭流。因此,您可以静默地读取一个命令的输出,在客户端进行一些计算,然后决定接下来要发送哪个命令。

只需确保不要将一个命令的输入与下一个命令的文本混合在一起 - 最好不要使用任何将从标准输入中读取的命令。


答案 2

使用shell通道,shell(在unix上它是sh或bash或类似的东西,在Windows上它通常是cmd.exe)启动并创建控制台(如果您在本地运行它们,则会在屏幕上看到相同)。您有一个提示,您可以解析该提示或用于检测命令的完成。

使用命令通道,为每个命令启动一个shell实例(实际上为每个命令打开通道),并将命令作为shell的参数传递(在Windows上,它看起来像“cmd.exe /c”)。

使用命令通道更容易,因为您不需要处理命令提示符。


推荐