Запустите cat на удаленном компьютере и отправьте вывод переменной с использованием ожидаемого - PullRequest
0 голосов
/ 12 августа 2011

У меня есть скрипт bash + ожидающий, который должен подключаться через ssh к удаленному компу (и я не могу использовать ssh-ключи, здесь требуется идентификация пароля), прочитать файл там, найти конкретную строку с "именем хоста" (например, «hostname 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 \r"
    expect ":~#"
    set line $expect_out(buffer)
    puts "line = $line, expect_out(buffer) = $expect_out(buffer)"
    ...more script...
    ENDOFEXPECT

Когда я пытаюсь увидеть строковую переменную, я вижу только это: line = , expect_out(buffer) = (buffer) Как правильно получить строку из файла в переменную? Или можно открыть файл на удаленном компьютере с помощью ожидаемого файла, отсканировать файл и получить то, что мне нужно, в переменную? Здесь 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, 
    set results $expect_out(buffer)

кажется, что в этом случае это не работает?

1 Ответ

1 голос
/ 16 августа 2011

Возможно, вы просто захотите попытаться сделать все от ожидаемого, поскольку ожидаемый может контролировать bash.

Следующее должно делать то, что вы описали. Не уверен, что это именно то, что вы пытаетесь сделать.

#!/bin/sh
# the next line restarts using tclsh \
exec expect "$0" "$@"


spawn bash 
send "ssh root@$IP\r"
expect "password:"
send "xxxx\r"
expect ":~#"
send "cat /etc/rc.d/rc.local |grep hostname \n"
expect ":~#"
set extractedOutput $expect_out(buffer)
set list [split $extractedOutput "\n"]
foreach line $list {
    set re {(?x)
        .*
        (*)              
        -S.*
    }
    regexp $re $line total extractedValue
    if {[info exists extractedValue] && [string length $extractedValue] > 1} {
        set exportValue $extractedValue
        break    # We've got a match!
}

send "exit\r" # disconnect from the ssh session

if {[info exists exportValue] && [string length $exportValue] > 1}{
    send "export VARIABLE $exportValue\r"
} else {
    send_user "No exportValue was found - exiting\n"
    send "exit\r"
    close
    exit 1
}

# now you can do more things in bash if you like
...