Ожидаемый сценарий: требуется средство для проверки SSH-соединения, не требующее пароля

#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 для подавления приветственных сообщений.