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

Executing multiple commands over SSH "exec" channel on firewall device with Java JSch does not work

我参考了问题 Multiple bash commands 并实现如下。我正在连接到第一个命令应该是 configure 的设备,然后我才会收到执行所有其他命令的提示。我没有得到任何命令的输出,控件也没有 return.

以下是可在终端中使用的命令。

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

根据要求,如果我这样做,输入密码后控件不会 return:

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”通道,尽管这通常不是实现命令自动化的正确方法。
参见 What is the difference between the 'shell' channel and the 'exec' channel in JSch

JSch 默认为“shell”通道启用终端仿真,这会带来很多不需要的副作用(参见). You may need to disable that by calling setPty

ChannelShell channel = (ChannelShell) session.openChannel("shell"); 

InputStream in = channel.getInputStream(); 
outStream = channel.getOutputStream(); 

channel.setPty(false);
channel.connect(); 

outStream.write('configure\n'.getBytes());  
outStream.write('move shared pre-rulebase security rules TEST top\n'.getBytes());