通过SSH执行多个命令”;执行官;带有Java JSch的防火墙设备上的通道不工作

通过SSH执行多个命令”;执行官;带有Java JSch的防火墙设备上的通道不工作,java,shell,ssh,jsch,Java,Shell,Ssh,Jsch,我提出了这个问题,并按如下方式实施。我正在连接的设备的第一个命令应该是configure,然后只有我会得到执行所有其他命令的提示。我没有得到任何命令的输出,控件也不会返回 以下是在终端中工作的命令 sshuname@ip configure#此命令更改提示符并启用以下命令 将共享预规则库安全规则测试移到顶部 犯罪 出口 出口 按照要求,如果我这样做,在输入密码后,控件不会返回: sshuser@host配置 剧本 String[] commands = new String[]{ "

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

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

sshuname@ip
configure#此命令更改提示符并启用以下命令
将共享预规则库安全规则测试移到顶部
犯罪
出口
出口
按照要求,如果我这样做,在输入密码后,控件不会返回:

sshuser@host配置
剧本

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();
String[]命令=新字符串[]{
“配置”、“移动共享规则库前安全规则测试顶部”、“提交”、“退出”};
FileWriter fileOut=新的FileWriter(outFileName,true);
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户,主机,22);
session.setPassword(密码);
session.setConfig(config);
session.connect();
System.out.println(“已连接”);
System.out.println(命令[0]);
ChannelExec channel=(ChannelExec)session.openChannel(“exec”);
((ChannelExec)channel).setCommand(命令[0]);
channel.setInputStream(空);
((ChannelExec)channel.setErrStream(System.err);
InputStream in=channel.getInputStream();
outStream=channel.getOutputStream();
channel.connect();
睡眠(1000);
对于(int i=1;i 0){
inti=in.read(tmp,0,1024);
if(i<0)
打破
结果字符串=新字符串(tmp,0,i);
fileOut.write(resultString);
}
if(channel.isClosed()){
如果(in.available()>0)继续;
System.out.println(“退出状态:+channel.getExitStatus());
打破
}
试一试{
睡眠(1000);
}捕获(异常ee){
}               
}
通道断开();
session.disconnect();
exptream.close();
fileOut.close();
设备上的“exec”频道似乎未正确执行。因此,您不能将代码用于“exec”通道。正如您可以“ssh”到设备一样,“shell”通道似乎完全正常工作。尝试与服务器管理员联系,以修复服务器

如果无法修复服务器,则必须恢复使用“shell”通道,尽管这通常不是实现命令自动化的正确方法。

默认情况下,JSch为“shell”通道启用终端仿真,这将带来许多不必要的副作用(请参阅)。您可能需要通过调用禁用该功能

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

如果无法修复服务器,则必须恢复使用“shell”通道,尽管这通常不是实现命令自动化的正确方法。

默认情况下,JSch为“shell”通道启用终端仿真,这将带来许多不必要的副作用(请参阅)。您可能需要通过调用禁用该功能

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());