JSch Как мне получить результаты из ряда переданных команд - PullRequest
0 голосов
/ 16 января 2020

Моя команда имеет первую часть, результаты которой передаются во вторую часть. Когда я запускаю код, мне всегда возвращаются результаты первой части, и фильтр, примененный второй частью, очевидно, не выполняется.

Итак, я получаю:

CONTAINER ID   IMAGE  COMMAND   CREATED      STATUS       PORTS   NAMES
abcdeff        a/b/1  "usr/.."  15 mins ago  Up to 2 mins         something.1.2
123abcd        a/b/2  "usr/.."  32 mins ago  exited               something.1.3
234456d        a/b/3  "usr/.."  2 days ago   exited               something.1.4

Где я want

CONTAINER
abcdeff
123abcd
234456d
public class Test {

  private static COMMAND =
  "echo \"password\" | sudo -S bash -c \"docker container ls --all | awk '{print $1}'\""

  executeExecCommand(command){
    JSch jsch = new JSch();
    Session session=jschgetSession(username, ipaddress, 22);
    session.setConfig("StrictHostKeyChecking", "no");
    session.setConfif("PreferredAuthentications", "password");
    Channel channel = session.openChannel("exec");
    ((ChannelExec)channel).setCommand(COMMAND);
    channel.setInputStream(null);
    ((ChannelExec)channel).setErrStream(System.err);
    InputStream input = channel.getInputStream();
    InputStream error = channel.getExtInputStream();
    channel.connect();
    List<String> output = new ArrayList<>();
    List<String> errorOutput = new ArrayList<>();

    try (InputStreamReader inputReader = new InputStreamReader(input);
      BufferedReader bufferedReader = new BufferedReader(inputReader);
      InputStreamReader errorReader = new InputStreamReader(error)) {

       String line = null;
       while (true) {
         while ((line = bufferedReader.readLine() != null {
         output.add(line:
         System.out.println("line = " + line);

       etc
       etc
       }
     }
}

Это как-то связано с тем, что конвейерный процесс выполняется в другой оболочке на целевом сервере? Если да, то как мне достичь цели по возвращению отфильтрованного списка?

1 Ответ

0 голосов
/ 17 января 2020

Мне нужно было убежать от $. COMMAND = "echo \" password \ "| sudo -S bash - c \" docker контейнер ls --all | awk '{print \ $ 1}' \ "" работает

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

COMMAND = "echo \" пароль \ "| sudo -S bash - c \" docker контейнер rm `docker контейнер ls --all | awk '{print \ $ 1}' \ `\" "

Требуется двойная обратная косая черта sh для выхода из $ и обратной косой черты. Это показывает, как один backsla sh здесь

...