2013-04-24 1 views
0
#!/bin/bash 
expect << EOF 
exp_internal 1 

spawn ssh [email protected] 
expect "ssword:" 
send "********\r" 
sleep 3 
set list [open list1 r] 

foreach line \$list 
{ 
    expect " $" 
    send "seeisso \$list | grep -E -i ' os |proddropdown|hostname'" 
    send "\r" 
    sleep 5 
    expect -re " $" 
    set fid [open out1.txt a] 
    puts \$fid \$expect_out(buffer) 
} 
close $fid 

EOF 

======цикл Еогеасп в скрипт ожидать не принимает переменные

Список 1 содержит:

APSE0112

ETLLT0000

======== =====

Результат сценария:

expect: does " " (spawn_id exp6) match glob pattern " $"? yes 
expect: set expect_out(0,string) " " 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) " " 
send: sending "seeisso file7 | grep -E -i ' os |proddropdown|hostname'" to { exp6 } 
send: sending "\r" to { exp6 } 

expect: does "" (spawn_id exp6) match regular expression " $"? no 


expect: does "\r\n" (spawn_id exp6) match regular expression " $"? no 
seeisso file7 | grep -E -i ' os |proddropdown|hostname' 

expect: does "\r\nseeisso file7 | grep -E -i ' os |proddropdown|hostname'\r\n" (spawn_id exp6) match regular expression " $"? no 

===================

Я не знаю, откуда она принимает значение file7. и когда я изменить:

send "seeisso \$list | grep -E -i ' os |proddropdown|hostname'"

в

send "seeisso **$list** | grep -E -i ' os |proddropdown|hostname'"

он принимает пустое значение:

expect: set expect_out(0,string) " " 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) " " 

send: sending "seeisso | grep -E -i ' os |proddropdown|hostname'" to { exp6 } 
send: sending "\r" to { exp6 } 

expect: does "" (spawn_id exp6) match regular expression " $"? no 


expect: does "\r\n" (spawn_id exp6) match regular expression " $"? no 
seeisso | grep -E -i ' os |proddropdown|hostname' 

===========

Помогите

+0

Почему у вас есть обратная косая черта перед '$ list' (т.е.' \ $ list')? Кроме того, я не вижу использования переменной 'line'. –

+0

В bash here-doc, если вы одинажите кавычек терминатора here-doc, вы фактически одинажите кавычки всего этого. Это облегчило бы большую часть вашего побега. Тем не менее, весь сценарий bash является ожидаемой программой. Уйти с bash вообще. Измените строку she-bang на: '#!/Usr/bin/expect -f'. –

+0

Ошибка Tcl: команды заканчиваются точками с запятой и символами новой строки, поэтому вы должны * поместить открывающую фигуру на ту же * линию, что и команда foreach. –

ответ

2

Я видел несколько проблем:

  1. list в вашем случае это действительно дескриптор файла, а не содержимое файла.
  2. У вас есть обратный слеш перед $list, которые я не понимаю причину
  3. Вы не используете ваш line переменной

Вот предложение, чтобы увидеть, если он работает:

set fileHandle [open list1] 
while {[gets $fileHandle line] != -1} { 
    expect " $" 
    send "seeisso $line | grep -E -i ' os |proddropdown|hostname'" 
    send "\r" 
    # the rest ... 
} 
close $fileHandle 
+0

Я пробовал код и получил следующую ошибку: отправить: отправить «password \ r» на {exp6} не удалось найти канал с именем «строка» при выполнении «получает строку» – nis

+0

Я пробовал свой код, используя ожидание (не в bash), и это сработало. Не уверен, почему он не работал с скриптом bash. – nis

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