有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我假设脚本如下所示:

    script_one.sh
    script_two.sh
    

    也就是说,脚本依赖于.环境变量中的PATH(当前路径),这不是默认值

    因此,为了让脚本能够正常工作,必须在某些启动脚本中将.添加到PATH中。添加很可能只在交互式会话中发生(可能是无意中错误)。可能是因为添加是在一个启动脚本中完成的,该脚本只针对交互式会话执行(源代码)

    JSch中的“exec”通道(正确地)没有为会话分配伪终端(PTY)。因此,与使用SSH客户端登录时相比,可能会(可能)获得一组不同的启动脚本。和/或根据TERM环境变量的存在与否,在脚本中采用不同的分支。因此,环境可能与SSH客户端使用的交互式会话不同


    解决方案如下(按优先顺序):


    另见相关问题Shell ping command with source option is failing when executed using JSch setCommand