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

我正在使用此处提供的有用示例,使用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();

回答:

我认为脚本看起来像:

script_one.sh

script_two.sh

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

因此,要使脚本正常工作,.必须将其添加到PATH某些启动脚本中。这种添加很有可能仅在交互式会话中发生(可能是无意间错误地)。可能是因为添加是在仅针对交互式会话执行(来源)的启动脚本中完成的。

JSch中的“

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


解决方案为(按优先顺序排列):

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

    ./script_one.sh

    ./script_two.sh

  • 更正启动脚本添加.PATH无条件地(甚至非交互式会话)。

  • (不建议)使用以下.setPty方法为“ exec”通道强制进行伪终端分配:

    Channel channel=session.openChannel("exec");

    ((ChannelExec)channel).setPty(true);

使用伪终端自动执行命令会给您带来讨厌的副作用。例如,请参见例如,有没有一种简单的方法来摆脱使用Python的Paramiko库进行SSH并从远程计算机的CLI提取输出时出现的垃圾值?


另请参阅相关问题使用JSch setCommand执行时,带有source选项的Shell

ping命令失败。

以上是 使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用 的全部内容, 来源链接: utcz.com/qa/413902.html

回到顶部