#tcl #expect
#tcl #ожидать
Вопрос:
Я системный тестировщик, и у меня есть определенный набор DUT, который может запускаться либо в предварительной версии прошивки, либо в релиз-кандидате. В предварительном выпуске я могу получить доступ к основной операционной системе Linux DUT, войдя в систему с определенной учетной записью пользователя. Кандидат на выпуск не допускает этого.
Вся основа сценария, который я пишу, заключается в том, чтобы иметь возможность удаленно выполнять скрипт, который находится на ИУ. Я хотел бы проверить, есть ли у меня доступ к основной ОС Linux с необходимостью ввода пароля или нет. Если у меня есть доступ, тогда продолжайте, иначе выйдите из сценария.
Я перепробовал много вещей, и каждая из них завершилась неудачей при тестировании с кандидатом на выпуск, поскольку ожидается ввод пароля. Вот последняя попытка:
set status [catch {exec ssh $user@$host ls} result]
if { [regexp "Password:" $result]} then {
# A password was asked for. Fail
puts "This is a Release Candidate VersionnAccess to the Linux OS is denied"
exit
} else {
# no password needed. Success
puts "This is a Pre-Release version"
}
При выполнении с предварительной версией этот код работает. Но когда требуется пароль, этого не происходит, поскольку сеанс SSH запрашивает пароль и ожидает ввода.
Есть ли у кого-нибудь обходной путь, который выходил бы за рамки сценария с требуемым паролем?
Спасибо
Комментарии:
1. У меня был бы большой соблазн переключиться на использование ключей с ssh, поскольку тогда вам вообще не нужно было бы использовать пароли. Но для этого требуется дополнительная настройка.
Ответ №1:
Если у вас есть случай, когда соединение с удаленной системой может запрашивать пароль, но не всегда это происходит, вам лучше всего установить соединение из expect. Это связано с тем, что expect
команде можно сказать ждать нескольких разных действий одновременно.
set timeout 20; # 20 seconds; if things don't respond within that, we've got problems
# 'echo OK' because it is quick and produces known output
spawn ssh $user@$host echo OK
# Wait for the possibilities we know about; note the extra cases!
expect {
"Password:" {
# Password was asked for
puts "This is a Release Candidate VersionnAccess to the Linux OS is denied"
close
exit
}
"OK" {
# Password not asked for
puts "This is a Pre-Release version"
}
timeout {
puts "There was a network problem? Cannot continue test"
close
exit 1
}
eof {
puts "Inferior ssh exited early? Cannot continue test"
close
exit 1
}
}
close
# ... now you've checked the connection ...
Комментарии:
1. Это сработало так, как я надеялся. Спасибо. Единственное изменение, которое я внес, — это добавить опцию «-q» в SSH для подавления приветственных сообщений.