0

「expect」に基づいて異なるパスワード文字列を送信するexpectスクリプトを作成しようとしています

  • 条件A:Ciscoデバイスにユーザー名が設定されていない場合、最初のプロンプトは単に「Password:」になります。次に、passwordA(ユーザー名なし)を使用する必要があります。

  • 条件B:ユーザー名で設定されている場合、プロンプトは「ユーザー名:」に続いて「パスワード:」になります-ユーザー名とパスワードBを使用する必要があります

#!/bin/bash
# Declare host variable as the input variable
host=$1 
 # Start the expect script
(expect -c "
set timeout 20
# Start the session with the input variable and the rest of the hostname
spawn telnet $host
set timeout 3 
if {expect \"Password:\"} {
send \"PasswordA\"}
elseif { expect \"Username:\"}
send \"UsersName\r\"}
expect \"Password:\"
log_user 0 
send \"PasswordB\r\"
log_user 1
expect \"*>\"
# send \"show version\r\"
# set results $expect_out(buffer) 
#expect \"Password:\"
#send \"SomeEnablePassword\r\"
# Allow us to interact with the switch ourselves
# stop the expect script once the telnet session is closed
send \"quit\r\"
expect eof
")
4

1 に答える 1

3

あなたはそれを間違っています。:)

expectステートメントは、最初に何が来るかを確認するのではなく、要求したものが表示されるまで待機し(そして、時間内に到着しない場合はタイムアウトします)、渡したコマンドを実行します。自分がやろうとしているような使い方ができると思いますが、良くありません。

expectswitchCステートメントやシェルステートメントなど、検索する代替案のリストを取得できcaseます。これがここで必要なものです。

私はこれをテストしていませんが、あなたが望むものは次のようになります:

expect {
  -ex "Username:" {
    send "UsersName\r"
    expect -ex "Password:" {send "PasswordB\r"}
  }
  -ex "Password:" {send "PasswordA\r"}
}

つまり、expectは、「Username:」または「Password:」(-ex完全一致、正規表現なし)のいずれか早い方を検索し、それに関連付けられたコマンドを実行します。


コメントに応じて、次のような2番目のパスワードを試します(ログインに成功すると「#」プロンプトが表示されると仮定します)。

expect {
  -ex "Username:" {
    send "UsersName\r"
    expect -ex "Password:" {send "PasswordB\r"}
  }
  -ex "Password:" {
    send "PasswordA1\r"
    expect {
      -ex "Password:" {send "PasswordA2\r"}
      -ex "#" {}
    }
  }
}

プロンプトを探すことなくそれを行うことはできますが、2番目の予期されるタイムアウト#に依存する必要があります。これは理想的ではありません。Password:

于 2012-10-26T12:50:23.100 に答える