我希望能够将 Java 应用程序中表示为字符串的许多连续命令发送到 SSH 服务器以执行。我应该使用:
Channel channel = session.openChannel("shell");
-或-
Channel channel = session.openChannel("exec");
最佳答案
您可以在 » Shell, Exec or Subsystem Channel 找到有关这些流之间异同的概述。 « 在 JSch 维基中。以下是您的用例的一些详细信息。
在 exec
channel ,命令来自您使用 setCommand()
提供的命令字符串. SSH 服务器会立即将它们传递给 shell(使用类似 bash -c '<command>'
的东西)。
如果 shell 由于某种原因之前没有退出,它们都将被执行。 (如果需要,您可以在此处发送一个完整的 shell 脚本,该脚本使用 if
和类似方法实现一些逻辑。)
因此,要执行多个命令,您可以通过 ;
分隔它们将它们传递到 exec channel 。或换行符 (\n
)。由于在给出所有命令之前您不能等待结果,因此您只能使用多个 exec channel (但由于每个 channel 都会产生一个新的 shell,它们不会保存它们之间的状态,例如工作目录或 shell 变量)。
在 shell
channel ,shell 将从流中读取输入,并将第一行解释为一个命令(或多个命令)。
然后它会执行这个命令。如果需要,命令本身可能会从流中读取更多输入。
然后shell会读取下一行,将其解释为命令,然后执行。
(在某些情况下,shell 必须读取多行,例如对于长字符串或组合命令,如 if 或循环。)
这将一直持续到流结束(例如您身边的 stream.close())或执行显式退出命令。
如果您不通过 channel 输入/输出流向外壳发送任何输入,外壳将简单地等待,直到您发送更多或关闭流。因此,您可以安静地读取一个命令的输出,在客户端进行一些计算,然后决定接下来发送哪个命令。
只要确保不要将一个命令的输入与下一个命令的文本混合在一起 - 最好不要使用将从标准输入读取的任何命令。
关于java - JSch中的 'shell' channel 和 'exec' channel 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770206/