Groovy: читать, а затем писать в интерактивный процесс - PullRequest
0 голосов
/ 08 мая 2019

Я начинаю думать, что мои навыки поиска не хватает.

Я пытаюсь найти какие-либо статьи о том, как с Groovy, открыть интерактивный процесс, прочитать его вывод и затем записать в процесс в зависимости от выходного текста. Все, что я могу найти, это как печатать, читать и писать с файлами. Ничего о том, как писать в интерактивный процесс.

  • Процесс запрашивает пароль
  • Введите пароль для обработки

Что-то вроде этого, если возможно:

def process = "some-command.sh".execute()
process.in.eachLine { line ->
    if (line.contains("enter password")) {
      process.out.write("myPassword")
    }
}


Это здесь работает чтение из процесса вывода:

def process = "some-command.sh".execute()
process.in.eachLine { line ->
    println line
}

Хотя он останавливается, когда процесс запрашивает ввод. Не выводится строка с вопросом.

Редактировать: выяснил, почему он не печатал строку с запросом пароля. Это была не новая линия. Вопрос был простой печать (не println). Как читать, когда еще нет новой строки?

Мне сказали, что можно использовать функцию ожидаемого, но я ищу решение, которое не требует зависимости.

1 Ответ

0 голосов
/ 08 мая 2019

1.bat

@echo off
echo gogogo
set /P V=input me:
echo V=%V%

этот скрипт ожидает ввода сразу после :

gogogo
input me:

это означает, что eachLine не сработал для input me потому что нет new line после него

однако предыдущая строка gogogo может быть перехвачена

и следующий скрипт работает для gogogo, но не работает для input me

groovy

def process = "1.bat".execute()
process.in.eachLine { line ->
    if (line.contains("gogogo")) {
        process.out.write("myPassword\n".getBytes("UTF-8"))
        process.out.flush()
    }
}

groovy2

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

def process = "1.bat".execute()
def pout = new ByteArrayOutputStream()
def perr = new ByteArrayOutputStream()

process.consumeProcessOutput(pout, perr) //starts listening threads and returns immediately
while(process.isAlive()){
    Thread.sleep(1234)
    if(pout.toString("UTF-8").endsWith("input me:")){
        process.out.write("myPassword\n".getBytes("UTF-8"))
        process.out.flush()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...