2016-02-06 5 views
1

Привет, я пытаюсь сохранить вывод команды, запускаемой через удаленное окно ssh ssh, в мой локальный узел, я новичок в ожидании, и я не знаю в состоянии выяснить, где я ошибаюсь. Мой код:Использование сценария ожидания для отправки вывода команды и хранения в файл

#!/bin/bash 

while read line 
do 
     /usr/bin/expect <<EOD 
     spawn ssh [email protected]$line 
     expect "assword:" 
     send -- "mininet\r" 
     set output [open "outputfile.txt" "a+"] 
     expect "[email protected]:*" 
     send -- "ls\r" 
     set outcome $expect_out(buffer) 
     send "\r" 
     puts $output "$outcome" 
     close $output 
     expect "[email protected]:*" 
     send -- "exit\r" 
     interact 
     expect eof 
EOD 
done <read_ip.txt 

Я получаю ошибку

 
expect: spawn id exp6 not open 
    while executing 
"expect "[email protected]:*"" 

Пожалуйста, любой орган может помочь мне в этом коде.

+0

Вы нашли опечатку "assword:"? Или это правильно? – e0k

+0

Привет, e0k Это не имеет значения, это правильно. –

ответ

1

У вас есть программа ожидания в оболочке heredoc. Оболочка будет расширять переменные в heredoc до запуск ожидается. Вы должны защитить переменные ожидания от оболочки.

Один из способов заключается в использовании «цитируемый» Heredoc и передать переменную оболочки ожидать через окружающую среду:

#!/bin/bash 
export host       ## an environment variable 
while read host 
do 
    /usr/bin/expect <<'EOD'   ## note the quotes here 
     spawn ssh [email protected]$env(host) ## get the value from the environment 
     expect "assword:" 
     send -- "mininet\r" 
     set output [open "outputfile.txt" "a+"] 
     expect "[email protected]:*" 
     send -- "ls\r" 
     set outcome $expect_out(buffer) 
     send "\r" 
     puts $output "$outcome" 
     close $output 
     expect "[email protected]:*" 
     send -- "exit\r" 
     expect eof     ## don't want both "interact" and "expect eof" 
EOD 
done <read_ip.txt 

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

Вы также можете исследовать команду ожидания log_file: вы можете включать и отключать ведение журнала по своему усмотрению, так же, как вы делаете вручную здесь.