Как отфильтровать вывод команды в ожидающем сценарии

Я пишу сценарий автоматизации, который входит в серверы и находит идентификатор приложения. Я использую сценарий ожидания, чтобы войти на каждый из серверов после ожидания подсказки. Когда я вхожу в систему, появляется стена текста по умолчанию (УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ и т. д.). Я пытаюсь сохранить вывод команды ПОСЛЕ входа на сервер, но безуспешно. Любой совет приветствуется

Это для Linux-сервера. Я пытался использовать $expect_out(buffer), но мне не удалось заглушить сообщение о входе в начале.

ssh -l <userid> <servername>
expect "$prompt" {send "ps -ef|grep java| grep -i 'jboss' |cut -f1 -d' '\r"}
set id $expect_out(buffer)
exec ./output.sh $id

Вывод, который я получаю, представляет собой подстроку сообщения входа в систему.

Если вы используете аутентификацию по ключу ssh, это может быть так же просто, как ssh -l user host './output.sh $(pgrep -fi java.*jboss)'

glenn jackman 22.07.2019 21:59

@glennjackman К сожалению, мне нужно вводить пароль для каждого сервера, поэтому я использую expect.

J. Tam 23.07.2019 15:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
718
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша проблема двояка:

  1. Вы не expect вводите ответ после send ввода команды. Без этого ответ, вероятно, не будет фактически обработан в тот момент, когда вы попытаетесь извлечь идентификатор из ответа.
  2. Переменная expect_out(buffer) может очень легко содержать текст, отличный от того, который вы хотите. Вы должны быть избирательны в сопоставлении, например, с регулярным выражением и опцией -re для `ожидать.

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

expect -re {(\d+)\n} {
    set id $expect_out(1,string)
}

Не забывайте включать режим отладки всякий раз, когда вы не можете понять, почему ваш сценарий ожидания работает неправильно. Обычно в нем точно говорится, в чем заключается (непосредственная) проблема, что очень помогает…

Кроме того, вы spawn читаете ssh? Вероятно, вы (и просто забыли написать это в своем вопросе), иначе ничего из этого не сработало бы…

Donal Fellows 22.07.2019 22:54

Привет, Донал, я создаю ssh. Не похоже, что скрипт получает ожидаемые параметры. Моя цель — запустить команду и получить разные выходные данные с каждого сервера.

J. Tam 23.07.2019 16:01
Ответ принят как подходящий

Я нашел решение. Чтобы получить ответ от моей команды, я использовал следующий код:

expect "$prompt"
set cmd "ps -ef|grep java|grep -i 'tomcat' | cut -f1 -d' '\r"
send -- $cmd
expect eof

expect -re "$ ps -ef | grep java | grep -i 'tomcat' | cut -f1 -d' '\r\n(.*)\r" {set output $expect_out(1,string)}

Я установил ожидаемое значение, чтобы оно содержало команду (с подсказкой), и заставило ее перейти на следующую строку, где будет мой желаемый вывод. Затем я устанавливаю для своей переменной $output значение $expect_out(1,string), которое принимает все, кроме ожидаемого значения, поэтому дает мне вывод моей команды.

Другие вопросы по теме