我正在设法使用 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
IE。该脚本依赖于.
(当前路径)位于PATH
环境变量,什么都不是默认的。
因此,为了使脚本能够正常工作,.
必须添加到PATH
在一些启动脚本中。很可能仅在交互式会话中添加(可能是无意的错误)。可能是因为添加是在仅针对交互式会话执行(来源)的启动脚本中完成的。
JSch 中的“exec”通道(理所当然)不会为会话分配伪终端 (PTY)。因此,与使用 SSH 客户端登录时相比,(可能)会获取一组不同的启动脚本。和/或根据不存在/存在,在脚本中采取不同的分支TERM
环境变量。因此,环境可能与您使用 SSH 客户端的交互式会话不同。
解决方案是(按优先顺序):
-
更正脚本,使其不依赖于非默认设置.
in PATH
。使用显式路径调用子脚本:
./script_one.sh
./script_two.sh
更正启动脚本以添加.
to the PATH
无条件(即使对于非交互式会话)。
-
(不推荐)使用以下命令强制为“exec”通道分配伪终端.setPty
method:
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);
使用伪终端自动执行命令可能会给您带来令人讨厌的副作用。参见示例有没有一种简单的方法可以消除使用 Python 的 Paramiko 库进行 SSH 并从远程计算机的 CLI 获取输出时出现的垃圾值?
另请参阅相关问题使用 JSch setCommand 执行时,带有源选项的 Shell ping 命令失败.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)