У меня есть сценарий bash + expect, который должен подключиться через ssh к удаленному компьютеру, прочитать там файл, найти определенную строку с «именем хоста» (например, «имя хоста aaaa1111») и сохранить это имя хоста в переменной, которая будет использоваться через некоторое время . Как я могу получить значение параметра hostname? Я думал, что содержимое строки будет в переменной $ expect_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)
кажется, что в этом случае не работает, или что не так со скриптом?
Почему вы используете для этого ожидания?
ssh -i ssh_private_key root@${IP} "grep -E -o 'hostname.*$' /etc/rc.d/rc.local"
Во-первых, ваш 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