2017-02-20 25 views
2

Я пытаюсь реализовать сценарий ожидания в скрипт bash. Потерпите меня, так как я довольно новичок в bash/expect.Ожидайте в скрипте bash

Вот скрипт ожидать, что работает, как предполагалось:

log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 

Теперь, я надеюсь включить этот сценарий ожидать в Баш скрипт, но он не работает должным образом.

Вот то, что я до сих пор:

#!/bin/bash 

XYZ=$(expect -c " 
file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
") 

echo "$XYZ" 

Ошибка я получаю:

command substitution: line 42: syntax error near unexpected token `(' 
command substitution: line 42: `expect "$ " { puts $fh "$expect_out(buffer)"}' 

Я открыт для любых других способов реализации этого! :)

+0

В вашем исходном скрипте переменная '$ servers' расширена Tcl, так как весь материал - это программа Tcl. В вашем втором скрипте переменная '$ server' расширена bash, и поскольку в ней нет переменной bash с этим именем, она заменяется пустой строкой. – user1934428

ответ

2

Вы можете использовать /usr/bin/expect -c выполнить expect команды:

#!/bin/bash 

/usr/bin/expect -c ' 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
' 
+0

Отлично, это именно то, что я искал. Благодаря! –

+0

Есть ли способ передать переменные в код ожидания с помощью этого подхода? – Kayvar

0

ответ Бертрана является одним из способов решить вопрос, но не объясняет проблему с тем, что вы делаете.

Bash пытается расширить переменные внутри строк в двойных кавычках, так что ваш expect скрипт будет видеть пустые пространства, где вы хотите увидеть $servers, $s и $fh. Кроме того, у вас трижды вложенные наборы строк с двумя кавычками, которые будут вызывать всевозможные проблемы с разбором аргументов до expect.

Это вопрос мнения, но я думаю, что когда что-то доходит до определенного момента, когда он считается собственной программой, его следует разделить на отдельный файл.

#!/usr/bin/expect 
log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
    spawn ssh $s 
    expect "password: " 
    send "PASSWORD\r" 
    expect "$ " 
    send "grep 'something' /some/log/file.log" 
    expect "$ " { 
     puts $fh "$expect_out(buffer)" 
    } 
    send "exit\r" 
} 

close $fh 

Убедитесь, что это исполняемый файл, а затем вызвать его из bash сценария:

#!/bin/bash 
/usr/local/bin/my_expect_script 

(Для того, чтобы сделать это действительно правильно, вы должны настроить проверку подлинности открытого ключа, а затем вы можете избавиться от ожидать в целом, запустив ssh server "grep 'something' /some/log/file.log" непосредственно из bash)

+0

Кроме того, ведение журнала в вашем скрипте 'expect' может быть сделано гораздо более кратко на стороне' bash'. – miken32