【问题标题】:Calling a shell script using SSH exec channel, but it ignores calls to other shell scripts使用 SSH exec 通道调用 shell 脚本,但它忽略了对其他 shell 脚本的调用
【发布时间】:2016-10-30 14:33:54
【问题描述】:

我正在使用此处提供的有用示例,使用 JSch exec 在远程服务器上执行 shell 脚本。我可以看到脚本返回的回声,最后的退出状态为 0 - 所以乍一看一切都很好。

但是,问题在于脚本本身调用了其他脚本,而这些似乎完全被忽略了,只是被跳过了。

脚本直接调用其他脚本。即脚本的第一行类似于:

script_two.sh

任何人都可以建议任何方法来克服这个问题吗?我确实开始查看“shell”通道而不是“exec”,但这在我的情况下可能很棘手,因为在授予用户访问系统之前,服务器会提供一个表格来填写(姓名,号码,为什么您登录等)- 我还不能以编程方式填写并提交此表单,所以如果可能的话,我想坚持使用 exec。

我对这一切都很陌生,所以欢迎任何帮助/建议!

下面的代码 sn-p。正如我所说,这似乎有效,但是代码中“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_two.sh 当我以同一用户身份手动运行脚本时,它工作正常,但使用 Jsch shell 远程运行时似乎被忽略了。

标签: java shell ssh jsch


【解决方案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

【讨论】:

  • Martin,我非常感谢您提供如此详细、经过深思熟虑和解释的回复。请知道这对我来说是一个巨大的帮助,并且已经很好地解释了事情。我将与团队,特别是负责远程服务器上的 .sh 脚本的人员进行交谈,以尝试执行此操作。我会在这里报告任何更新。你是绝对正确的,脚本是从主脚本调用的,没有 .
  • 再次感谢!刚刚接受了答案并阅读了链接中的注释“请不要对您的问题或回答说“谢谢”添加评论”。哎呀-对不起!现在我又来了!一旦实际实施和测试,我将添加更多技术(非社交)注释。
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 2013-05-10
  • 2011-05-14
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多