2016-10-13 3 views
0

Я системный тестер, и у меня есть определенный набор тестируемых устройств, которые могут запускаться либо в предварительно выпущенной версии прошивки, либо в кандидате на выпуск. В предварительном выпуске я могу получить доступ к основной ОС Linux тестируемого устройства, войдя в систему с определенной учетной записью пользователя. Кандидат на выпуск не допускает этого.Ожидающий скрипт: нужны средства для проверки соединения SSH, не нужен пароль

Вся основа сценария, который я пишу, заключается в возможности удаленного выполнения сценария, который находится на тестируемом устройстве. Я хотел бы проверить, есть ли у меня доступ к основной ОС Linux с необходимостью пароля или нет. Если у меня есть доступ, продолжайте еще выходить из сценария.

Я пробовал много вещей, и каждый из них потерпел неудачу при тестировании против кандидата на выпуск, поскольку ожидается пароль. Вот последняя попытка:

set status [catch {exec ssh [email protected]$host ls} result] 
    if { [regexp "Password:" $result]} then { 
     # A password was asked for. Fail 
     puts "This is a Release Candidate Version\nAccess to the Linux OS is denied" 
     exit 
    } else { 
     # no password needed. Success 
     puts "This is a Pre-Release version" 
    } 

Выполняется в отношении предварительной версии настоящего кода. Но когда требуется пароль, он не работает, поскольку сеанс SSH запрашивает пароль и ждет ввода.

У кого-нибудь есть обходное решение, которое вырвалось бы из сценария требуемого пароля?

Спасибо

+0

У меня было бы очень искушение переключиться на использование ключей с помощью ssh, так как тогда вам вообще не понадобились бы пароли. Но это требует большей настройки. –

ответ

2

Если у вас есть случай, когда подключение к удаленной системе может запросить пароль, но не всегда собирается, ты лучше делать соединение изнутри ожидать. Это связано с тем, что команде 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 [email protected]$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 Version\nAccess 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 ... 
+0

Это работало так, как я надеялся. Спасибо. Единственное изменение, которое я сделал, это добавить параметр «-q» в SSH для подавления приветственных сообщений. –