Помогите с сценарием ожидаемого, запустите cat на удаленном компе и получите его вывод в переменную
У меня есть сценарий bash+ ожидающий, который должен соединиться через ssh с удаленным компом, прочитать там файл, найти определенную строку с "именем хоста" (например, "имя хоста aaaa1111") и сохранить это имя хоста в переменной, которая будет использоваться через некоторое время, Как я могу получить значение параметра "hostname"? Я думал, что содержимое строки будет в переменной $ allow_out(buffer) (чтобы я мог ее отсканировать и проанализировать), но это не так. Мой сценарий:
#!/bin/bash
----bash part----
/usr/bin/expect << ENDOFEXPECT
spawn bash -c "ssh root@$IP"
expect "password:"
send "xxxx\r"
expect ":~#"
send "cat /etc/rc.d/rc.local |grep hostname \n"
expect ":~#"
set line $expect_out(buffer)
puts "line = $line, expect_out(buffer) = $expect_out(buffer)"
...more script...
ENDOFEXPECT
Здесь http://en.wikipedia.org/wiki/Expect есть пример:
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
кажется, что это не работает в этом случае, или что не так со сценарием?
2 ответа
Во-первых, ваш heredoc действует как строка в двойных кавычках, поэтому $expect_out
переменная подставляется перед expect
начинается. Вы должны убедиться, что оболочка не затрагивает ваш heredoc. Следовательно, любые переменные оболочки должны выбираться другим способом. Здесь я предполагаю IP
переменная оболочки, и я передаю ее через окружение.
export IP
/usr/bin/expect << 'ENDOFEXPECT'
set prompt ":~#"
spawn ssh root@$env(IP)
expect "password:"
send "xxxx\r"
expect $prompt
send "grep hostname /etc/rc.d/rc.local \n"
expect $prompt
set line $expect_out(buffer)
...more script...
ENDOFEXPECT
Почему вы используете для этого ожидания?
ssh -i ssh_private_key root@${IP} "grep -E -o 'hostname.*$' /etc/rc.d/rc.local"