Я в настоящее время использую, ожидают передавать пароль rsync для копирования файлов через серверы Unix
test.sh
./expect.sh $password rsync -azvr $username@$host:$file ./$dir
expect.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 секунд или при получении отклоненного ответа в случае неверного пароля. В противном случае, если он получает «отправленный» текст, он продолжается.