ожидать сценарий + подходит ожидать в случае, если пароль не требуется - PullRequest
1 голос
/ 27 февраля 2012

Следующий ожидаемый скрипт работает нормально, когда $ IP компьютера Linux запрашивает пароль после входа в систему

Но в некоторых случаях некоторые машины Linux не нуждаются в пароле для ssh (мы можем войти без пароля),

поэтому мне нужно изменить сценарий ожидаемого доступа для поддержки машин без пароля

Пожалуйста, посоветуйте, как настроить мой ожидаемый скрипт для поддержки машин с паролем и машин без пароля

 * target of the following expect script is to check the hostname on remote Linux machine


 expect_test=`cat << EOF
 set timeout -1
 spawn  ssh $IP  hostname
       expect {
                 ")?"   { send "yes\r"  ; exp_continue  }
                 word:  {send "pass123\r"     }
      }
 expect eof
 EOF`



 expect -c "$expect_test"

пример exe на удаленной машине (с паролем) (имя удаленной машины - Linux1_machine)

  IP=10.17.18.6

  expect -c "$expect_test"

  spawn ssh 10.17.18.6 hostname
  sh: /usr/local/bin/stty: not found
  This computer system, including all related equipment, networks and network devices     (specifically including Internet access),is pros
  yes
  Password: 
  Linux1_machine

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

 IP=10.10.92.26


 expect -c "$expect_test"


 spawn ssh 10.10.92.26 hostname
 sh: /usr/local/bin/stty: not found
 Linux15_machine
 expect: spawn id exp5 not open
 while executing
 "expect eof"

1 Ответ

2 голосов
/ 27 февраля 2012

У вас есть несколько вариантов.

Если вы знаете, чего ожидать от серверов, к которым вам не нужно входить (например, сеанс переходит прямо к приглашению), добавьте оператор ожидаемого с этим:

expect {
                     ")?"   { send "yes\r"  ; exp_continue  }
                     word:  {send "pass123\r"     }
                     "prompt"    { do something }
          }

Если у вас нет согласованных подсказок, вы можете попробовать использовать регулярное выражение , обнаружив широкий диапазон подсказок:

set prompt “(%|#|\\$) $” ;# default prompt
expect {
      ")?"   { send "yes\r"  ; exp_continue  }
      word:  {send "pass123\r"     }
      -re $prompt { do something }
}

Если вы вообще не знаете, что вы получите (кажется маловероятным), вы также можете добавить действие, когда время ожидания истекает.

expect {
                 ")?"   { send "yes\r"  ; exp_continue  }
                 word:  {send "pass123\r"     }
                 timeout { do something }
      }

, что позволит ожидать движения, когда он не получает другие ожидаемые линии.

См. http://wiki.tcl.tk/11583 для конкретных примеров того, что вы пытаетесь сделать. Также стоит прочитать главу Начало работы с Expect из книги Орейли .

...