Я написал фрагмент кода в TCL, ожидая подключения с сервера 1 к серверу 2 с использованием ssh. Пользователи уже могли установить беспарольную связь между сервером 1 и сервером 2, или он может запросить пароль. Код должен обрабатывать все эти три возможных сценария ниже:

  1. Если вход без пароля включен между Сервером 1 и Сервером 2
  2. Вход без пароля не включен, отображается запрос «Пароль:».
  3. Если пользователь вводит неправильный пароль, ожидается второе приглашение Password:, где будет введено Ctrl + C и произойдет выход.

Пожалуйста, найдите ниже код

#!/usr/bin/expect -f
lassign $argv 1 2 
spawn ssh -o StrictHostKeyChecking=no $1@$2

expect {
      "*]#" { send -- "sleep 0\n" }  #Prompt when passwordless is active and user have logged in
      "Password: " {send -- "$2\n"   #Password prompt when no passwordless is active.
             exp_continue }
      "Password: " {send -- "^C" }   # Second Password Prompt when the wrong password is entered 
                                       in previous step. From here code should exit with a message
       }
 expect "*]#"                # After SSH is successful

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

0
newuser 27 Апр 2020 в 09:37

1 ответ

Возможно:

set count 0
expect {
    "Password:" {
        if {[incr count] == 2} {
            # this is the 2nd time, send Ctrl+C
            send -- \x3
            expect eof
            error "incorrect password"
        } else {
            send -- "$2\r"
            exp_continue
        }
    }
    "$prompt"
}
# successfully logged in.
send -- something 
...
0
glenn jackman 29 Апр 2020 в 02:48
К сожалению, он перешел к блоку # successfully logged in. send -- something даже после неправильного пароля.
 – 
newuser
29 Апр 2020 в 12:01