使用 Java JSch 在防火墙设备上通过 SSH "exec" 通道执行多个命令不起作用



我提出了多个bash命令的问题,并按如下方式实现。我正在连接到一个设备,应该为其configure第一个命令,然后只有我会收到执行所有其他命令的提示。我没有得到任何命令的输出,控件也没有返回。

以下是在终端中工作的命令。

ssh uname@ip
configure # this command changes prompt and enable following commands
move shared pre-rulebase security rules TEST top 
commit
exit
exit

按照要求,如果我这样做,输入密码后控件不会返回:

ssh user@host configure

脚本

String[] commands = new String[]{
    "configure", "move shared pre-rulebase security rules TEST top", "commit", "exit"};
FileWriter fileOut = new FileWriter(outFileName, true);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
System.out.println("Connected");
System.out.println(commands[0]);
ChannelExec channel = (ChannelExec) session.openChannel("exec");
((ChannelExec) channel).setCommand(commands[0]);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
outStream = channel.getOutputStream();
channel.connect();
Thread.sleep(1000);
for(int i=1;i<commands.length;i++) {
    System.out.println("Executing:"+commands[i]);
    outStream.write((commands[i]+"n").getBytes());
    outStream.flush();
}
byte[] tmp = new byte[1024];
while (true) {
    while (in.available() > 0) {
        int i = in.read(tmp, 0, 1024);
        if (i < 0)
            break;
        resultString = new String(tmp, 0, i);                   
        fileOut.write(resultString);
    }
    if (channel.isClosed()) {
        if(in.available()>0) continue; 
        System.out.println("exit-status: " + channel.getExitStatus());
        break;
    }
    try {
        Thread.sleep(1000);
    } catch (Exception ee) {
    }               
}
channel.disconnect();
session.disconnect();
outStream.close();
fileOut.close();

设备上的"exec"频道似乎未正确实现。因此,您不能将代码与"exec"通道一起使用。由于您可以"ssh"到设备,因此"shell"通道似乎已完全正常工作。尝试与服务器管理员联系,以修复服务器。

如果修复服务器不可行,您将不得不恢复使用"shell"通道,尽管这通常不是实现命令自动化的正确方法.
请参阅 JSch 中的"外壳"通道和"exec"通道有什么区别

默认情况下,JSch 为"shell"通道启用终端仿真,这将带来很多不需要的副作用(请参阅 使用 JSch 从 SSH 服务器读取命令输出时获取不需要的字符(。您可能需要通过调用 setPty 来禁用它。

ChannelShell channel = (ChannelShell) session.openChannel("shell"); 
InputStream in = channel.getInputStream(); 
outStream = channel.getOutputStream(); 
channel.setPty(false);
channel.connect(); 
outStream.write('configuren'.getBytes());  
outStream.write('move shared pre-rulebase security rules TEST topn'.getBytes());

最新更新