문제

Cisco 장치에서 일부 구성 백업을 자동화하려고 노력했지만 작업을 수행하는 스크립트를 이미 수행했지만 오류를 처리하기 위해이를 개선하려고합니다.

로그인 오류 (액세스 거부 메시지)와 '예상 ": end "'line에서 'send "$ pass r "'직후에 두 단계에서 오류를 포착해야한다고 생각합니다. 발행 된 명령이 장치에서 구성을 가져올 수 있는지 확인하기 위해.

기대 스크립트에서 작업하면 몇 가지 방법을 보았지만 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
도움이 되었습니까?

해결책

오류를 잡으려는 예상 진술에서 대체 패턴이 필요합니다. 특정 오류 메시지를 찾고 있다면 정상 출력이 나타나지 않을 때 트리거되는 타임 아웃 핸들러를 지정하도록 지정할 수 있습니다.

예를 들어. ~ 후에 send \"$pass\r\" 대신에 expect \">\" 노력하다:

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

즉. 시간 초과 (기본 10 초) 전에 예상 출력이 도착하면 아무것도하지 않고 계속하십시오. SSH 세션이 끝나는 경우와 일치하기 위해 EOF 패턴이 필요할 수도 있습니다. 예상되는 변수 대체를 수행하지 않으므로 문자열 주위에 ""가 필요하지 않으므로 {} 또는 한 단어가있을 때는 아무것도 사용할 수 없습니다. expect conf 그리고 send {no pager}.

BTW 나는 BSTPIERRE에 BASH를 떨어 뜨리고 모든 것을 기대하면 더 깨끗하다는 데 동의하지만 Bash가 작업을 수행하면 괜찮습니다.

다른 팁

단일 따옴표를 사용하지 않는 경우 (expect -c '...'), 그러면 모든 $ 변수는 Bash가 기대하지 않는 것으로 대체됩니다. 기대 코드를 별도의 파일 또는 헤르 디크에 넣기가 더 쉬울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top