2017-01-31 12 views
2

Я пытаюсь запустить сценарий ожидания, где он делает цикл foreach в именах хостов, затем делает ssh в узлах и получает техническую поддержку. Каждый узел имеет переменное время для вывода информации о технической поддержке.Ожидайте, скрипт не работает в цикле для ssh

Usage: 
    ./test.sh admin password 

Filename: hostnames.txt 
      node1 

Сценарий: test.sh

#!/usr/bin/expect 
set exp_internal 1 
set timeout 4 
set user [lindex $argv 0] 
set password [lindex $argv 1] 
set rootdir /home/$user 
set f [open "$rootdir/hostnames.txt"] 
set hosts [split [read $f] "\n"] 
close $f 
log_user 1 

foreach host $hosts { 
puts $host 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null "[email protected]$host" 
expect "*assword: " 
send "$password\r" 
expect "#" 
send "file md /TS/\r" 
expect "#" 
send "admin tech-support /TS/$host.ts1\r" 
expect "#" 
sleep 180 
expect "#" 
send "logout\r" 
expect eof 
close $spawn_id 
} 

Я получаю ошибку, как показано ниже, есть только узел в файле hostnames.txt, но он возвращает ошибку когда техподдержка завершается в node1. так что не уверен, если он будет работать для другого узла, если добавлено в hostnames.txt файле

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null [email protected] 
ssh: : Name or service not known 
send: spawn id exp6 not open 
while executing 
"send "$password\r"" 
("foreach" body line x) 
invoked from within 
"foreach host $hosts { 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHost..." 
(file "./test4.sh" line x) 

ответ

1

Раскол дает вам список с двумя записями: строку в hostnames.txt до символа новой строки, а затем пустая строка, которая после строки новой строки. Вам нужно проверить, является ли $ host непустой строкой.

Добавьте еще одну строку в hostnames.txt и убедитесь, что она ведет себя правильно для второго хоста. Если у вас нет другого тестового узла, который вы хотите попробовать, вместо этого добавьте повторяющуюся строку, читающую «node1», и посмотрите, что обе итерации цикла выполняют одно и то же.

+0

Привет, Тим, спасибо за обновление, я понял, что ... я добавил чек там "if {[string length $ host]! = 0}" .... теперь atleast i dont get ssh error но im все равно получить ошибку "отправить: spawn id exp6 not open" – user3897774

+0

В выводе, который вы показали в вопросе, он выглядел так, как $ host был пуст - разве это все еще так? И работает ли он правильно для node1? Вот что я понял из вашего первоначального вопроса. Является ли "if {[длина строки $ host]" ... частью, охватывающей весь корпус цикла foreach, или просто командой spawn? Извините, я не совсем понимаю, где это для вас. –

+0

Я не уверен, почему он забирает пустую строку ... У меня нет другой записи, кроме node1 в этом файле ..... теперь после того, как поместить это, если проверить ..... я не получаю ошибку ... i поместите этот оператор if до появления в цикле foreach .... – user3897774

 Смежные вопросы

  • Нет связанных вопросов^_^