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

Java 使用SSH exec通道调用shell脚本,但它忽略对其他shell脚本的调用,java,shell,ssh,jsch,Java,Shell,Ssh,Jsch,我正在使用这里提供的有用示例,使用jschexec在远程服务器上执行shell脚本。我可以看到从脚本返回的回音,最后的退出状态是0-所以乍一看一切都很好 但是,问题是脚本本身调用其他脚本,而这些脚本似乎被完全忽略,只是跳过了 该脚本直接调用其他脚本。i、 e.脚本的第一行类似于: script_two.sh 有人能提出克服这一问题的办法吗?我确实开始研究“shell”频道而不是“exec”,但在我的情况下,这可能会很棘手,因为在允许用户访问系统之前,服务器会提供一个要填写的表单(名称、编号、您

我正在使用这里提供的有用示例,使用jschexec在远程服务器上执行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();

我假设脚本如下所示:

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

因此,为了使脚本能够正常工作,必须在某些启动脚本中将
添加到
路径中。添加很可能只在交互式会话中发生(可能是无意中错误地)。可能是因为添加是在仅为交互式会话执行(源代码)的启动脚本中完成的

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


解决方案包括(按优先顺序):

  • 更正脚本,使其不依赖于在
    路径中设置
    的非默认设置。使用显式路径调用子脚本:

    ./script_one.sh
    ./script_two.sh
    
  • 更正启动脚本以无条件地将
    添加到
    路径
    (即使对于非交互式会话也是如此)

  • (不推荐)使用
    .setPty
    方法强制为“exec”通道分配伪终端:

    Channel channel=session.openChannel("exec");
    ((ChannelExec)channel).setPty(true);
    
    使用伪终端自动执行命令可能会带来严重的副作用。例如,见



另请参阅一个相关问题。

“调用其他脚本,而这些脚本似乎被完全忽略,只是跳过了”-脚本如何调用其他脚本?他们怎么会被忽视?“呼叫”是否产生任何错误消息?谢谢您的回复。该脚本直接调用其他脚本。i、 e.脚本的第一行是这样的:-script_two.sh当我以同一用户的身份手动运行脚本时,它工作正常,但当使用Jsch shell远程运行时,它似乎被忽略了。Martin,我非常感谢您提供了如此详细、经过深思熟虑和解释的响应。请知道,这对我是一个巨大的帮助,并且已经很好地解释了事情。我将与团队,特别是负责远程服务器上的.sh脚本的人员进行交谈,以尝试执行此操作。我会在这里汇报最新情况。你说得很对,脚本是从主脚本调用的,没有使用。再次感谢!我只是接受了答案,只是阅读了链接“请不要对你的问题或答案添加评论”中的注释,然后说“谢谢”。哦,对不起!现在我又在做了!一旦实际实现和测试,我将添加更多的技术(非社交)注释。