java - 使用 SSH exec channel 调用 shell 脚本,但它会忽略对其他 shell 脚本的调用

标签 java shell ssh jsch

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

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

脚本直接调用其他脚本。即脚本的第一行是这样的:

script_two.sh

任何人都可以建议任何方法来克服这个问题吗?我确实开始研究“shell” channel 而不是“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 中。添加很可能只发生在交互式 session 中(可能是无意中错误地)。可能是因为添加是在仅为交互式 session 执行(来源)的启动脚本中完成的。

JSch 中的“执行” channel (理所当然地)不会为 session 分配伪终端 (PTY)。因此,当您使用 SSH 客户端登录时,会(可能)获取一组不同的启动脚本。和/或根据 TERM 环境变量的存在/不存在,采用脚本中的不同分支。因此,环境可能不同于您使用 SSH 客户端的交互式 session 。


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


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

关于java - 使用 SSH exec channel 调用 shell 脚本,但它会忽略对其他 shell 脚本的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38073260/

相关文章:

java - JUnit如何测试多个函数

javascript - 如何使用 shell 脚本文件运行我的 Node 脚本

git - 无法推送到基于 ssh 的 git 存储库

shell - 如何通过SSH发送Shell命令而无需每次都打开新连接?

shell - 如何在不实际运行 "vagrant ssh"的情况下 ssh 到 vagrant ?

java - JNDI 作为服务定位器设计模式是否不好?

java - 完成广播接收器的所有 Activity

java - 不能在另一个文件夹中包含 FXML 文件

shell - 运行ssh-copy-id时忽略input_userauth_banner

python - 计算两个文本文件的混淆矩阵