java使用SSH exec通道调用shell脚本,但忽略对其他shell脚本的调用
我正在使用这里提供的有用示例,使用JSch exec在远程服务器上执行一个shell脚本。我可以看到脚本返回的回声,最后的退出状态是0——所以乍一看一切都很好
然而,问题是脚本本身调用其他脚本,而这些脚本似乎被完全忽略,只是跳过了
该脚本直接调用其他脚本。i、 e.脚本的第一行是这样的:
script_two.sh
有人能提出克服这个问题的方法吗?我确实开始研究“shell”频道而不是“exec”,但在我的情况下,这可能会很棘手,因为在让用户访问系统之前,服务器会提供一个要填写的表单(姓名、号码、您为什么登录等)-我还无法以编程方式填写和提交此表单,因此,如果可能的话,我想继续使用exec
我对这一切都不熟悉,所以欢迎提供任何帮助/建议
下面是代码片段。正如我所说,这似乎是可行的,但代码中用“scriptFileName”表示的sh脚本调用其他sh脚本,这些脚本不会被执行
非常感谢您的帮助,J
JSch jsch = new JSch();
JSch.setConfig(FileTransferConstants.STRICT_HOST_KEY_CHECKING, "no");
Session session = jsch.getSession(username, hostIPAddress, port);
session.setPassword(password);
session.connect();
//create the execution channel over the session
ChannelExec channelExec = (ChannelExec)session.openChannel("exec");
channelExec.setCommand(scriptFileName);
channelExec.connect();
# 1 楼答案
我假设脚本如下所示:
也就是说,脚本依赖于
.
环境变量中的PATH
(当前路径),这不是默认值因此,为了让脚本能够正常工作,必须在某些启动脚本中将
.
添加到PATH
中。添加很可能只在交互式会话中发生(可能是无意中错误)。可能是因为添加是在一个启动脚本中完成的,该脚本只针对交互式会话执行(源代码)JSch中的“exec”通道(正确地)没有为会话分配伪终端(PTY)。因此,与使用SSH客户端登录时相比,可能会(可能)获得一组不同的启动脚本。和/或根据
TERM
环境变量的存在与否,在脚本中采用不同的分支。因此,环境可能与SSH客户端使用的交互式会话不同解决方案如下(按优先顺序):
更正脚本,使其不依赖于在
PATH
中使用.
的非默认设置。使用显式路径调用子脚本:更正启动脚本以无条件地将
.
添加到PATH
(即使对于非交互式会话也是如此)(不推荐)使用
.setPty
方法强制为“exec”通道分配伪终端:使用伪终端自动执行命令可能会带来严重的副作用。参见示例Is there a simple way to get rid of junk values that come when you SSH using Python's Paramiko library and fetch output from CLI of a remote machine?
另见相关问题Shell ping command with source option is failing when executed using JSch setCommand