Выполнение нескольких команд через SSH на устройстве брандмауэра с Java JSch - PullRequest
1 голос
/ 07 июня 2019

Я передал вопрос Несколько команд bash и реализован, как показано ниже.Я подключаюсь к устройству, для которого первая команда должна быть configure, тогда только я получу приглашение выполнить все остальные команды.Я не получаю вывод ни для одной из команд, и элемент управления не возвращается.

Ниже приведены команды, которые работают в терминале.

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

Сценарий

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

1 Ответ

0 голосов
/ 10 июня 2019

Канал "exec" на вашем устройстве, похоже, реализован неправильно.Таким образом, вы не можете использовать свой код с каналом «exec».

Поскольку вы можете подключить «ssh» к устройству, кажется, что канал «shell» полностью работает.

JSch по умолчанию включает эмуляцию терминала для канала «shell», что приведет к множеству нежелательных побочных эффектов (см. Получение нежелательных символов при чтении вывода команды с SSH-сервера с использованием JSch ).Отключите это, позвонив по номеру 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());   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...