3 回答
TA贡献1817条经验 获得超14个赞
JSch中的“exec”通道(正确地)不为会话分配伪终端(PTY)。因此,可能(可能)采购了一组不同的启动脚本(特别是对于非交互式会话,.bash_profile
未采购)。和/或脚本中的不同分支基于TERM
环境变量的存在/存在而被采用。所以环境可能与交互式会话不同,您可以使用SSH客户端。
所以,在你的情况下,PATH
可能设置不同; 因此air
无法找到可执行文件。
要验证这是根本原因,请在SSH客户端中禁用伪终端分配。例如,在PuTTY中,它的连接> SSH> TTY>不分配伪终端。然后,转到Connection> SSH> Remote命令并输入您的air ...
命令。在退出时检查会话>关闭窗口>从不打开会话。您应该得到相同的“未找到空气”错误。
按优先顺序解决此问题的方法:
修复命令不依赖于特定环境。
air
在命令中使用完整路径。例如:/bin/air sandbox run <graph-path>
如果您不知道完整路径,则在常见的* nix系统上,您可以
which air
在交互式SSH会话中使用命令。修复启动脚本,
PATH
为交互式和非交互式会话设置相同的启动脚本。尝试通过登录shell显式运行脚本(使用
--login
带有常见* nix shell的开关):bash --login -c "air sandbox run sandbox run <graph-path>"
如果命令本身依赖于特定的环境设置而无法修复启动脚本,则可以在命令本身中更改环境。该语法取决于远程系统和/或shell。在常见的* nix系统中,这有效:
String command="PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";
另一种(不推荐)方法是使用以下
.setPty
方法强制“exec”通道的伪终端分配:Channel channel = session.openChannel("exec");((ChannelExec)channel).setPty(true);
使用伪终端自动执行命令可能会带来令人讨厌的副作用。
添加回答
举报