bashスクリプトから呼び出されるexpectコマンド内の条件ステートメント

StackOverflow https://stackoverflow.com/questions/1638369

  •  08-07-2019
  •  | 
  •  

質問

Ciscoデバイスでいくつかの設定バックアップを自動化しようとしていますが、タスクを実行するスクリプトを実行できましたが、エラーを処理するように改善しようとしています。

2つのステップでエラーをキャッチするには、最初に「送信\" $ pass \ r \"」の直後が必要だと思いますログインエラー(アクセス拒否メッセージ)および 'expect \&quot ;: end \"'を取得する行、発行されたコマンドがデバイスから設定をプルできることを確認します。

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

#!/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
役に立ちましたか?

解決

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

たとえば expect \"> \" の代わりに send \" $ pass \ r \" を試してください:

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

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

ところでbstpierreに同意します。bashをドロップしてすべてを期待通りに実行した場合、これはよりクリーンになるでしょうが、bashで問題ない場合は

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top