Назад | Перейти на главную страницу

поймать вывод сценария bash из expect, ожидать зависаний

В настоящее время я использую ожидание передачи пароля в rsync для копирования файлов на серверы unix
test.sh

 ./expect.sh $password rsync -azvr  $username@$host:$file ./$dir

ожидать.sh

#!/usr/bin/expect -f                                                                                                                                                                                
eval spawn [lrange $argv 1 end]
#expect  "(yes/no)?"                                                                                                                                                                                
#send "yes\r"                                                                                                                                                                                       
expect "*?assword:*"
send [lindex $argv 0]
send \r
interact

если пароль сервера был изменен, но не обновлен в скрипте, я хочу получить уведомление. однако в настоящее время он просто зависает на неопределенный срок. Если я сделаю следующее в test.sh

output=`./expect.sh $password rsync -azvr  $username@$host:$file ./$dir`

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

Вам следует отредактировать свой сценарий ожидания, чтобы учесть время ожидания и ожидаемый результат после rsync.

Например:

...
set timeout 60
expect "*?assword:*"
send [lindex $argv 0]
expect {
 timeout { send_user "\nFatal Error: unable to rsync \n"; exit 1}
 "denied" { send_user "\nFatal Error: unable to rsync \n"; exit 1}
 "sent"
}

Вышеупомянутое приведет к выходу из сценария в случае тайм-аута 60 секунд или при получении отклоненного ответа в случае неверного пароля. В противном случае, если он получает «отправленный» текст, он продолжается.