当前位置: 首页 > 面试题库 >

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

梁兴文
2023-03-14
问题内容

我正在使用此处提供的有用示例,使用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选项的Shellping命令失败。



 类似资料:
  • 用途:使用php将命令直接输入minecraft服务器控制台 我正在尝试使用php脚本(从浏览器运行)来执行shell脚本。当我从终端运行php时,它就可以工作了!但在浏览器中,什么都不会发生。 从终端运行时,我得到一个“数组0”,但浏览器给我一个“数组1” 问题是什么?一旦我运行了shell,之后的一切不应该像在终端上一样工作吗?(shell脚本内部的内容是否重要?) shell拥有所有rx权限

  • 问题内容: 我试图弄清楚如何从Shell脚本调用Python函数。 我有一个具有多个功能的Python文件,我需要在我的shell脚本中使用它们返回的值。有没有办法做到这一点。 我这样做是为了使用Python读取配置文件并在shell中获取值。还有其他更好的方法来实现这一目标。 包含: 我需要将Python函数返回的值存储在shell变量中。 问题答案: 您可以通过要求Python解释器打印结果来

  • 问题内容: 如何从外壳脚本内部执行Java方法? 问题答案: 您只能调用该方法。设计您的方法,使其调用所需的方法。 当我说 调用 方法时,您不会显式调用它。调用它是Java程序的唯一入口点。 如果您的班级看起来像: 您可以使用以下命令行在您可以找到的目录中调用from (如果您位于下面显示的结构的目录中): 如果要从其他目录(请参见下面的目录结构)执行此操作,则必须设置类路径。 为了清楚起见,请采

  • 问题内容: 应用。现在我想用AngularJS实现一个动态菜单。因此,我需要从现有应用程序更改AngularJS应用程序中的变量。 我正在尝试以下示例: 从外部脚本调用“ resetName()”函数的正确方法是什么? 问题答案: 只需将选择器附加到定义了控制器的DOM元素即可。喜欢 在任何地方都可以调用该控制器功能,例如 要么 在某些情况下,您需要修改控制器的对象值,您可以通过简单的方式进行操作

  • 本文向大家介绍详解Shell脚本中调用另一个Shell脚本的三种方式,包括了详解Shell脚本中调用另一个Shell脚本的三种方式的使用技巧和注意事项,需要的朋友参考一下 主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。 exec 在同

  • 一、解放生产力 以下脚本需要放入一个可执行文件中,实现双击就可以运行! 1.1、快速提交代码 # Mac 上可以去掉脚本的第一行标志:「#!/bin/bash」 # 加上这个,颜色码会失效 # 1、cd 到当前目录 currentDir=$(cd "$(dirname "$0")"; pwd) cd ${currentDir} # 2、获取当前的分支 currentBranch=$(git s