スイッチを「自動的に」接続し、expect
コマンドを使用して_startup-config
_を取得するbash関数を作成しました。このスイッチは_ssh user@Host
_方式を受け入れないため、expect
を使用する必要があり、ユーザーとパスワードのタプルを再度要求します。
これは私がそれらのバックアップを管理するために作成した関数です
_main_pc3548(){
/usr/bin/env expect <<-END3548
spawn ssh -o StrictHostKeyChecking=no -o LogLevel=quiet $IP
expect "User Name:"
send "$USER\r"
expect "Password:"
send "$PASS\r"
expect "*# "
send "copy startup-config tftp://$SERVER/$SWNAME.cfg.bkp\r"
sleep 8
END3548
}
_
このコードブロックはスイッチタイプを分離し、スイッチリストに次のスイッチモデルがある場合はmain_pc3548()
を呼び出します。
_egrep -v '(^#|^\s*$|^\s*\t*#)' $LISTA_SWITCHES | while read IP SWNAME SERVER TIPO
do
if [ "$TIPO" = core ]; then
main_pc6248
Elif [ "$TIPO" = dep ]; then
main_pc3548
else
echo "$(date "+%d/%m/%Y-%T") - Switch $SWNOME Have a martian type of switch" >> $LOG_FILE
fi
done
_
スクリプトの残りの部分は、スイッチIP、TFTP IPアドレス、スイッチ名に関する情報を含むかなり長いファイルを読み取り、各スイッチを8秒間待機すると多くの時間がかかります。 このスリープが必要です tftpコピーを壊すための遅い接続を避けるために、ここに私の質問があります:
この関数を「マルチスレッド」してパフォーマンスを向上させる簡単な方法はありますか?
解決策は、@ devnullがコメントで与えたヒントでした:バックグラウンドで各関数を実行します
# Trata comentários na lista de switches
egrep -v '(^#|^\s*$|^\s*\t*#)' $LISTA_SWITCHES | while read IP SWNOME SERVER TIPO
do
if [ "$TIPO" = core ]; then
pc6248 &
Elif [ "$TIPO" = dep ]; then
pc3548 &
Elif [ "$TIPO" = rfs ]; then
rfs6000 &
else
echo "$(date "+%d/%m/%Y-%T") - Switch $SWNOME possui tipo marciano de switch" >> $LOG_FILE
fi
done
これで、20秒後に約50個のスイッチでバックアップが完了しました:)