SSH с JSch для нескольких команд с промежуточным выводом - PullRequest
0 голосов
/ 18 сентября 2018

Я очень новичок в JSch.Я пытаюсь выполнить несколько команд на сервере, которые я получаю в качестве входных данных от какой-либо другой системы.Я беру эти команды и передаю их в качестве параметра в java-метод.Например:

public String readFileFromPath(String server, String path,
            String fileName);

Здесь сначала мы должны перейти к «пути», затем нам нужно прочитать какой-то конкретный контент из файла, присутствующего на пути.Чтобы реализовать это, я сделал следующее:

Session session = sshOperations.getSessionWithTimeout(USER,server,SSHPORT,1000);
Channel shellChannel = sshOperations.getShellChannel(session);
InputStream in = new PipedInputStream();
PipedOutputStream consoleInput = new PipedOutputStream((PipedInputStream) in);
OutputStream out = new PipedOutputStream();
BufferedReader consoleOutput = new BufferedReader(new InputStreamReader(new PipedInputStream((PipedOutputStream) out)));
shellChannel.setInputStream(in);
shellChannel.setOutputStream(out);
shellChannel.connect(1000);
consoleInput.write(("cd "+path).getBytes());

// first While
while ((line = consoleOutput.readLine()) != null)
{
    System.out.println("check "+ line);
}

// execute second command
consoleInput.write("cat some.properties".getBytes());

// second While
while ((line = consoleOutput.readLine()) != null)
{
    System.out.println("check "+ line);
}

Теперь я знаю, что когда я подключаюсь к этому серверу, я получаю текст приветствия:

"You are using <serverName> server. Please contact admin for any issues" Итак, после первого цикла while мойВыполнена команда cd, и она напечатает сообщение, упомянутое выше.Но после этого он ожидает большего вывода из выходного потока (он застрял в этой точке), и выходной поток не может произвести ничего, пока я не выполню другую команду.

Каким-то образом я хочу выйти из первогоЦикл while без записи логики для использования 2-х строк (фиксированных).Что касается следующей команды, я не буду знать, сколько строк будет выводиться в потоке.

Пожалуйста, предложите логику для получения желаемого результата, т.е. я выполнил команду, и некоторая логика потребляет ее, а затем я получаювыполнить другую команду и так далее до тех пор, пока не будут выполнены все команды, поступившие в качестве параметра.

Есть ли другой способ добиться того же самого?

Спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Не используйте "оболочку" канала.Канал «shell» предназначен для реализации интерактивного сеанса (отсюда и приветственного сообщения), а не для автоматизации выполнения команд.

Для автоматизации выполнения команд используйте канал «exec».См. Несколько команд через оболочку JSch .

Хотя на самом деле вам не нужно несколько команд.Там нет необходимости для cd.Просто используйте полный путь в команде cat

ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("cat " + path + "/some.properties");
channel.connect();

Хотя на самом деле, если вы хотите читать содержимое файлов, используйте SFTP вместо запуска консольных команд, таких как cat.SFTP - это стандартизированный API для доступа к файлам через SFTP.

См. Передача файлов SFTP с использованием Java JSch .

...