2016-08-31 3 views
0

У меня есть время цикла, как, например:Ожидайте сценарий побежал внутрь в то время как цикл завершается после обработки одной строки

#!/bin/bash 

doit="/pathtocommand" 
file="/pathtosourcefile" 

while read -r username password; do 

$doit "$username" "$password" 

done < $file 

И моя команда в то время как петля ($ пустяк) является ожидать сценарий.

#!/usr/bin/expect -f 

## Set up variables to be passed in as command line arguments 
#set username [lindex $argv 0]; 
#set password [lindex $argv 1]; 
lassign $argv username password 

spawn telnet 192.168.100.101 106 
expect "200 PWD Server ready"  
send "USER user\r" 
expect "300 please send the PASS" 
send "PASS password\r" 
expect "200 login OK, proceed" 

## Use the line below for passwords that do not have to be enclosed with quotes 
send "SETACCOUNTPASSWORD $username PASSWORD $password\r" 

# Use the line below for a password that must be quoted ie one that contains a $ or a ! by escaping the double quotes 
#send "SETACCOUNTPASSWORD $username PASSWORD \"$password\"\r" 

expect "200 OK" 
send "quit\r" 
interact 

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

Если отладить скрипт я вижу это:

+ doit=/pathtocommand 
+ file=/pathtofile 
+ read -r username password 
+ /pathtofile 0100 01000100 
spawn telnet 192.168.100.101 106 
Trying 192.168.100.101... 
Connected to 192.168.100.101. 
Escape character is '^]'. 
200 PWD Server ready 
USER user 
300 please send the PASS 
PASS pass 
200 login OK, proceed 
SETACCOUNTPASSWORD 0100 PASSWORD 01000100 
200 OK 
quit 
+ read -r username password 

Он смотрит на меня, как скрипт пытается начать все сначала, но потом выходит. Может ли кто-нибудь помочь? Я нахожусь в хрусте, чтобы заставить эту работу работать. Я уже делал это с SSH без проблем. Не уверен, что это telnet вещь или что.

ответ

2

Команда interact в сценарии Expect читает со стандартного ввода. Так как стандартный ввод перенаправляется в файл, expect будет читать из файла, и в следующем цикле оболочки ничего не останется для цикла while оболочки.

Чтобы связаться с терминалом, вам необходимо перенаправить его обратно на /dev/tty.

$doit "$username" "$password" </dev/tty 

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

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