使用 JSch 通过 Java 执行时,某些 Unix 命令失败并出现“未找到命令”错误
通过 Java 执行 Unix 命令时会出现此问题使用 JSch 库。当“air not find”之类的命令失败时,尽管在 SSH 客户端中工作,仍需要进一步调查。
根本原因:
与交互式 SSH 会话不同, JSch 中的“exec”通道不分配伪终端。这可能会导致执行一组不同的启动脚本,从而导致不同的环境。在这种情况下,PATH环境变量可能设置不同,导致“air”可执行文件不可用。
解决方案:
有多种方法可以解决此问题问题,按优先顺序排列:
-
完整路径执行:
在命令中使用可执行文件的完整路径,消除对环境的依赖。
-
启动脚本修改:
调整启动脚本设置交互式和非交互式会话的 PATH 一致。
-
登录 Shell执行:
使用 --login 开关通过登录 shell 显式运行命令。
-
环境修改:
将命令本身的环境更改为设置必要的 PATH 和/或其他变量。
-
强制伪终端分配:
(不推荐)使用 setPty(true) 强制为“exec”通道进行伪终端分配,但要注意潜在的副作用。
相关问题:
其他类似问题已经遇到并在下面讨论资源:
- 当使用 JSch 通过 Java 执行时,即使启用了 setPty,某些 Unix 命令也会失败,并显示“...未找到”
- 使用 JSch 执行的命令的行为与 SSH 终端中的行为不同(绕过“是/”否”的确认提示消息)
- JSch:有没有办法将用户环境变量暴露给“exec”通道?
- 使用 SSH.NET SshClient.RunCommand 执行的命令 (.4gl) 失败,并显示“没有此类文件或目录”
以上是为什么使用 JSch 通过 Java 执行某些 Unix 命令时会失败并显示'未找到命令”?的详细内容。更多信息请关注PHP中文网其他相关文章!