2017-01-02 7 views
-1

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

./script

#!/usr/local/bin/expect -f 
while /usr/bin/read hostname 
do 
spawn ssh [email protected]$hostname 
expect "[email protected]$hostname's password" 
send "resuidt\n" 
expect "[email protected]$hostname" 
interact 
done < srvlist 

Ниже моя ошибка:

missing operand at [email protected]_ 
in expression "[email protected]_/usr/bin/read" 
    (parsing expression "/usr/bin/read") 
    invoked from within 
"while /usr/bin/read hostname" 
    (file "./script" line 3) 

Нужна помощь, чтобы исправить эту ошибку.

ответ

1

Вы пишете программу Expect, которая в основном представляет собой программу Tcl. Ваш цикл while не Tcl syntax, но выглядит как сценарий (Posix/Ksh/Bash/Zsh).

Вы должны решить: записать все в Tcl или разделить приложение на два файла: один (в сценарии оболочки) как «основная программа» и отдельный сценарий ожиданий, который будет вызываться оболочкой скрипт.

+0

Как написать так. Любой пример ссылки может быть полезен. –

+1

Что вы подразумеваете под «этим»: решение Tcl-only или смешанное решение Shell/Tcl? – user1934428

0

Как пользователь1934428 указывает, что вы используете синтаксис синтаксиса bash-типа while. Ниже приведен пример того, как заставить скрипт ожидания выполнять нужные действия.

#!/usr/local/bin/expect -f 

set file hostname 
set user myusername 
set passwd mypassword 

set f [open $file] 
foreach target [split [read $f] "\n"] { 
    spawn ssh [email protected]$target 
    expect { 
    timeout {send_user "Expect Timeout\n" ; exit} 
    "password:" 
    } 
    send "$passwd\r" 
    expect { 
    timeout {send_user "Expect Timeout\n" ; exit} 
    "[email protected]$target" 
    } 
    interact 
} 
close $f 

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

0

, если вы хотите использовать переменные оболочки непосредственно в ожидать сценарий, то вы должны передать эти переменные как $ ENV (shell_variable_name) внутри ожидать сценарий

пример: икра SSH $ ENV (MyUserName) @ $ ENV (имя хоста)