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。但是,这种方法可能会带来不必要的副作用。
有关其他见解和类似问题,请参阅以下资源:
以上是为什么在 Java 中通过 JSch 执行 Unix 命令时会失败并出现“Not Found”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!