2

期待スクリプトを使用して ssh ログインを自動化する Bash スクリプトを作成しました。スクリプトは複数のサーバーに接続し、いくつかのコマンドを実行します。bash スクリプトは、ログイン資格情報を 1 回要求します。

最初のサーバーへのログインが失敗した場合にスクリプトが終了し、スクリプトが次のサーバーをチェックしてユーザー アカウントがロックされるのを回避する機能を組み込みたいと考えています。アカウントのロックアウトは、3 回連続してログインに失敗した場合に発生し、スクリプトが接続を試みるサーバーの数が 3 を超えています。

これは、expect スクリプトを呼び出す bash スクリプトのスニペットです。

countu=0
for servername in $(cat $linux_host_list)
do
./script.expect $LUSERNAME $LPASS $servername Linux >> linux_log_file.txt & < /dev/null
let countl=countl+1
done

そして、ここに期待スクリプト(script.expect)スニペットがあります

#!/usr/bin/expect -f
set timeout 30
set username [lindex $argv 0]
set SPASS [lindex $argv 1]
set servername [lindex $argv 2]
set case [lindex $argv 3]
set prompt "(%|#|\\$|%\]) $"
switch $case {
    Linux {
        log_user 0
        spawn ssh -o StrictHostKeyChecking=no $username@$servername
        expect  {
            "assword:" {
                send "$SPASS\r"
                expect -re "$prompt"
            }
            expect -re "$prompt"
        }
        send "sudo su -\r"
        expect {
            "assword:" { send "$SPASS\r" }
        }
        expect -re "$prompt"
        log_user 1
        send "opcagt -status ; opctemplate -l ; cat watch.cf 2> /dev/null\r"
        expect -re "$prompt"
        log_user 0
        send "exit\r"
        expect -re "$prompt"
        log_user 1
    }

$?期待スクリプトのパスワードが正しくないためにログインに失敗した場合、bash コマンドがゼロ以外の値を返すと仮定して、bash コマンドの出力 ( ) を取得しようとしましたが、うまくいきませんでした。どんな提案でも大歓迎です。

4

5 に答える 5

1

Fabricを真剣に検討する必要があります。

于 2009-08-19T19:36:46.730 に答える
1

セクション:

    expect  {
        "assword:" {
            send "$SPASS\r"
            expect -re "$prompt"
        }
        expect -re "$prompt"
    }

私には非常に疑わしいように見えます。特に、それが物事を混乱させる原因になることを本当に期待しています。より慣用的な書き方は次のようになります。

    expect  {
        "assword:" {
            send "$SPASS\r"
            exp_continue
        }
        -re "$prompt"
    }
于 2010-10-02T20:12:08.580 に答える
0

バックグラウンドでスクリプトを実行している&ため ( )、続行する前に最初のスクリプトの結果を取得できません。

あなたの期待スクリプトが書かれている方法では、最初のパスワードが失敗した場合、2 番目のパスワード プロンプトで 30 秒のタイムアウトが発生します。代わりに、expect別のasswordプロンプトが表示されるかどうかを確認し、すぐに終了する別の方法を実行できます。

次に、シェル スクリプトを変更して、expect 呼び出しをバックグラウンドに置かないようにし、代わりに出力をキャプチャし$?てテストします。

于 2010-07-21T14:57:11.330 に答える
0

私はスクリプティングなどにあまり興味がないので、正確な手順やスクリプトを書いて、私が考えたことを証明することはできません - 申し訳ありません

さて、私はbashが終了ステータスと呼ばれるものを提供することを読みました

終了ステータスは、true の場合は 0、false の場合は 1 またはそれ以外のステータスです。

これは、コマンドを実行し、「echo $?」と入力して終了ステータスを確認することで確認できます。

私が提案するのは、1 つのサーバーに ssh しようとして認証に失敗した場合、0 以外の終了ステータスが表示されることです。

ここで if-then-else ループを取得し、スクリプト実行のステータス 0 とその他の値をチェックして、適切なエラー メッセージでスクリプトを完全に終了します。

于 2009-08-20T07:55:47.930 に答える