Помогите с сценарием ожидаемого, запустите 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"
Другие вопросы по тегам