使用SSH exec通道调用shell脚本,但它忽略对其他shell脚本的调用。

3
我正在使用JSch exec来执行远程服务器上的shell脚本,使用这里提供的有用示例。我可以看到来自脚本的回显,并且最后的退出状态为0-所以乍一看一切都很好。
然而,问题在于脚本本身调用其他脚本,而这些脚本似乎完全被忽略了,直接跳过了。
脚本直接调用其他脚本。也就是说,脚本的第一行类似于:
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();

“调用其他脚本,但这些脚本似乎完全被忽略,直接跳过” - 脚本如何调用其他脚本?它们是如何被忽略的?“调用”是否会产生任何错误消息? - Martin Prikryl
谢谢您的回复,马丁。该脚本直接调用其他脚本。例如,脚本的第一行是这样的:- script_two.sh。当我以相同的用户手动运行脚本时,它可以正常工作,但是在使用Jsch shell远程运行时似乎被忽略了。 - Jonathan Head
1个回答

3
我假设脚本长这个样子:
script_one.sh
script_two.sh

即脚本依赖于PATH环境变量中的当前路径.,这不是默认设置。
因此,为了使脚本正常工作,必须在某个启动脚本中添加.PATH。很可能添加的只是交互式会话的启动脚本(可能无意地不正确)。这可能是因为执行添加的启动脚本仅适用于交互式会话。
JSch中的“exec”通道(正确地)不为会话分配伪终端(PTY)。因此,与使用SSH客户端的交互式会话相比,可能使用不同的启动脚本集合。此外,基于TERM环境变量的存在/缺失,可能采取不同的分支脚本。因此,环境可能与您使用SSH客户端的交互式会话不同。
解决方案如下(按优先顺序):

还有一个相关问题,请参考使用JSch setCommand执行时,带源选项的Shell ping命令失败


Martin,我无法感谢你提供如此详细、深思熟虑和解释清晰的回复。请知道这对我来说是非常有帮助的,已经很好地解释了事情。我将与团队以及负责远程服务器上.sh脚本的人进行交流,尝试让他们采取行动。我会在这里报告任何更新。你是完全正确的,脚本是从主脚本中调用的,没有加上“.”。 - Jonathan Head
1
再次感谢!我刚刚接受了答案,并阅读了链接中的注释“请不要在您的问题或答案上添加评论以表示“谢谢””。哎呀-抱歉!现在我又这样做了!一旦实际实施和测试完成,我将添加进一步的技术(非社交)注释。 - Jonathan Head

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接