Я пишу сценарий автоматизации, который входит в серверы и находит идентификатор приложения. Я использую сценарий ожидания, чтобы войти на каждый из серверов после ожидания подсказки. Когда я вхожу в систему, появляется стена текста по умолчанию (УВЕДОМЛЕНИЕ О БЕЗОПАСНОСТИ и т. д.). Я пытаюсь сохранить вывод команды ПОСЛЕ входа на сервер, но безуспешно. Любой совет приветствуется
Это для 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
Вывод, который я получаю, представляет собой подстроку сообщения входа в систему.
@glennjackman К сожалению, мне нужно вводить пароль для каждого сервера, поэтому я использую expect.
Ваша проблема двояка:
expect
вводите ответ после send
ввода команды. Без этого ответ, вероятно, не будет фактически обработан в тот момент, когда вы попытаетесь извлечь идентификатор из ответа.expect_out(buffer)
может очень легко содержать текст, отличный от того, который вы хотите. Вы должны быть избирательны в сопоставлении, например, с регулярным выражением и опцией -re
для `ожидать.Я предполагаю, что исправление состоит в том, чтобы изменить эту третью строку на:
expect -re {(\d+)\n} {
set id $expect_out(1,string)
}
Не забывайте включать режим отладки всякий раз, когда вы не можете понять, почему ваш сценарий ожидания работает неправильно. Обычно в нем точно говорится, в чем заключается (непосредственная) проблема, что очень помогает…
Кроме того, вы spawn
читаете ssh
? Вероятно, вы (и просто забыли написать это в своем вопросе), иначе ничего из этого не сработало бы…
Привет, Донал, я создаю ssh. Не похоже, что скрипт получает ожидаемые параметры. Моя цель — запустить команду и получить разные выходные данные с каждого сервера.
Я нашел решение. Чтобы получить ответ от моей команды, я использовал следующий код:
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), которое принимает все, кроме ожидаемого значения, поэтому дает мне вывод моей команды.
Если вы используете аутентификацию по ключу ssh, это может быть так же просто, как
ssh -l user host './output.sh $(pgrep -fi java.*jboss)'