首页  >  文章  >  Java  >  为什么在 Java 中通过 JSch 执行 Unix 命令时会失败并出现“Not Found”错误?

为什么在 Java 中通过 JSch 执行 Unix 命令时会失败并出现“Not Found”错误?

Patricia Arquette
Patricia Arquette原创
2024-11-12 00:33:02944浏览

Why do Unix commands fail with

Unix 命令通过 JSch 执行失败,出现“未找到”错误

尝试通过 Java 中的 JSch 库执行某些 Unix 命令时,用户可能会遇到错误,指出无法找到该命令。

了解问题

与交互式 SSH 客户端不同,JSch 的“exec”通道默认不分配伪终端(PTY)。与交互式会话相比,环境的这种差异可能会导致启动脚本执行和路径设置不同。因此,依赖于特定环境变量的命令可能会失败。

确定根本原因

要确认根本原因,请在 SSH 客户端中禁用 PTY 分配并尝试手动执行命令。如果您遇到相同的“未找到”错误,则表明交互式会话和非交互式会话之间的 PATH 环境变量不同。

解决方案

解决此问题,按优先顺序考虑以下解决方案:

1.修改命令以显式定义可执行文件的路径

String command = "/bin/air sandbox run <graph-path>";

2.调整启动脚本以一致地设置 PATH

确保远程服务器上的启动脚本中的交互式和非交互式会话的 PATH 设置相同。

3.使用登录 shell 运行命令

在命令前面加上“bash --login -c”以通过登录 shell 显式运行它,这通常会设置一致的环境:

String command = "bash --login -c \"air sandbox run <graph-path>\"";

4。直接在命令中设置环境变量

对于严重依赖特定环境设置的命令,请考虑直接在命令中设置变量:

String command = "PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";

5.强制 PTY 分配(不推荐)

作为最后的手段,您可以使用 .setPty(true) 强制为“exec”通道分配 PTY。但是,这种方法可能会带来不必要的副作用。

有关其他见解和类似问题,请参阅以下资源:

  • 某些 Unix 命令失败并显示“...未找到” ,当使用 JSch 通过 Java 执行时,即使启用了 setPty
  • 使用 JSch 执行的命令的行为与 SSH 终端中的行为不同(绕过确认提示消息"yes/"no")
  • JSch:有没有办法将用户环境变量公开给“exec”通道?
  • 使用 SSH.NET SshClient.RunCommand 执行的命令 (.4gl) 失败与“没有这样的文件或目录”

以上是为什么在 Java 中通过 JSch 执行 Unix 命令时会失败并出现“Not Found”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn