我正在使用此处提供的有用示例,使用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客户端一起使用的交互式会话.
解决方案为(按优先顺序排列):
>更正脚本,使其不依赖具有的非默认设置.在PATH中.用显式路径调用子脚本:
./script_one.sh
./script_two.sh
>更正启动脚本以添加.无条件地连接到PATH(即使是非交互式会话).
>(不推荐)使用.setPty方法为“ exec”通道强制伪终端分配:
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);
使用伪终端自动执行命令会给您带来讨厌的副作用.例如参见Is there a simple way to get rid of junk values that come when you SSH using Python’s Paramiko library and fetch output from CLI of a remote machine?
另请参阅相关问题Shell ping command with source option is failing when executed using JSch setCommand.