0

cisco デバイスで構成のバックアップを自動化しようとしてきました。タスクを実行するスクリプトを実行することはできましたが、エラーを処理するようにスクリプトを改善しようとしています。

ログイン エラー (アクセス拒否メッセージ) を取得するための「send \"$pass\r\"」の直後と、「expect \": end\"」行の 2 つのステップでエラーをキャッチする必要があると思います。発行されたコマンドがデバイスから構成を取得できたことを確認します。

期待するスクリプトで作業する場合、いくつかの方法を見てきましたが、bash スクリプトを使用して、.txt ファイルからデバイスのリストを提供できるようにしたいと考えています。

#!/bin/bash

data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
log=/firewall/log/bkpCisco.$data.log
user=MYUSER
pass=MYPASS

for firewall in `cat /firewall/script/firewall.cisco`
do

VAR=$(expect -c "
spawn ssh $user@$firewall
expect \"assword:\"
send \"$pass\r\"
expect \">\"
send \"ena\r\"
expect \"assword:\"
send \"$pass\r\"
expect \"#\"
send \"conf t\r\"
expect \"conf\"
send \"no pager\r\"
send \"sh run\r\"
log_file -noappend /firewall/backup/$firewall.$data.cfg.tmp
expect \": end\"
log_file
send \"pager 24\r\"
send \"exit\r\"
send \"exit\r\"
")

echo "$VAR"
done
4

2 に答える 2

1

エラーをキャッチしたい場合は、expect ステートメントに代替パターンが必要です。特定のエラー メッセージを探している場合は、それを指定できます。代わりに、通常の出力が表示されなかったときに最終的にトリガーされるタイムアウト ハンドラーを指定することもできます。

例えば。試しsend \"$pass\r\"た後:expect \">\"

expect \">\" {} timeout {puts stderr {Could not log in}; exit}

すなわち。期待される出力がタイムアウト (デフォルトは 10 秒) の前に到着した場合は、何もせずに続行します。ssh セッションが終了するケースに一致する eof パターンも必要になる場合があります。期待値では変数置換を行わないため、文字列を \"\" で囲む必要がないことに注意してください。{} を使用することも、1 つの単語の場合は何も使用しないこともできます。expect confsend {no pager}

ところで、私はbstpierreに同意します。bashを落としてすべてを期待どおりに実行した場合、これはよりクリーンになりますが、bashが仕事をする場合は問題ありません。

于 2009-10-30T09:15:38.783 に答える
0

一重引用符 ( ) を使用しない場合expect -c '...'、すべての $variables は予期せず bash に置き換えられます。予期されるコードを別のファイルまたはヒアドキュメントに配置する方が簡単な場合があります。

于 2009-10-28T21:44:14.013 に答える