java - JSch中的 'shell' channel 和 'exec' channel 有什么区别

标签 java ssh jsch

我希望能够将 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/

相关文章:

php - PHP pear 缺少 'MDB2.php'

java - 使用 Jsch Java API 获取远程系统时间戳

java - 如何编写一个方法来穿插两个不同长度的数组?

java - Java中高效的XML解析|相当于 Java 中的 C# XmlDocument

mercurial - 如何通过 TortoisePlink 和 KeyRing 使受密码保护的 PPK 停止在 TortoiseHG 中询问密码

java - 使用 Java 进行 SSH 私钥验证

jsch - 如何增加 jsch 缓冲区大小?

java - 我应该使用哪种工厂设计模式?

java - 常见做法是什么?类型放置

ssh - pssh,超时,被信号 9 杀死