Назад | Перейти на главную страницу

помогите с ожидаемым сценарием, запустите cat на удаленном компьютере и получите вывод его в переменную

У меня есть сценарий 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