현재 작업은 여러 라우터의 비밀번호를 확인하고 비밀번호가 여전히 기본값으로 설정되어 있는 경우 이를 변경하는 것입니다(예: 로그인: ABC, 비밀번호: ABC).
이에 대한 예상 스크립트를 작성했지만 몇 가지 문제가 있습니다.
코드는 다음과 같습니다.
#!/usr/bin/expect -f
spawn telnet 10.15.160.69 #using a test IP, later it will read IP's from a list.
expect {
"Login: " {
send "ABC\r"
exp_continue
}
"Password: " {
send "ABC\r"
exp_continue
}
"> " {
send "passwd\r"
expect "Username: "
send "ABC\r"
expect "Password: "
send "ABC\r"
expect "New Password: "
send "n3wp@ss\r"
expect "Confirm New Password: "
send "n3wp@ss\r"
expect "> "
send "save\r"
}
}
이제 라우터에는 3번의 비밀번호 시도 후에도 로그아웃하지 않는 특수 동작이 있지만 대신 올바른 자격 증명이 제공되거나 Ctrl+D
(EOF)를 누를 때까지 로그인 및 비밀번호를 묻는 메시지가 계속 표시됩니다.
아래를 보세요:
Trying 10.15.160.69...
Connected to 10.15.160.69.
Escape character is '^]'.
BCM96816 Broadband Router
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Authorization failed after trying 3 times!!!.
Login: Password:
Login incorrect. Try again.
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Authorization failed after trying 3 times!!!.
Login:
Password:
Login incorrect. Try again.
스크립트 내에서 을 보내면 eof
스크립트가 깔끔하게 종료됩니다.
Expect 스크립트는 bash 스크립트에서 호출됩니다.
#!/bin/bash
for host in $(cat ipnmap.txt);do
echo "${host}";
/usr/bin/expect passchange1.sh $host
done
동일한 기능을 달성하기 위해 Expect를 사용할 수 있다는 것을 알고 있지만 bash에서 수행하는 것을 선호합니다.
필요한 것은 라우터가 두 번째로 자격 증명을 요청하면 스크립트가 다음 IP로 이동해야 한다는 것입니다. 왜냐하면 처음에 실패하면 라우터에 우리가 원하는 기본 비밀번호가 없다는 의미이기 때문입니다. 하다. 필요한 경우 다음 IP/라우터로 이동할 수 있습니다(비밀번호 변경은 라우터에 기본 사용자 이름/비밀번호가 있는 경우에만 필요합니다).
이 문제를 해결하기 위한 지침을 제공해 주시면 매우 감사하겠습니다. 감사해요
답변1
모든 것을 하나의 명령문에 넣는 대신 로그인의 각 부분을 별도의 일치 항목으로 간단히 분산시킬 수 있습니다. expect
특히 어떤 시퀀스를 얻게 될지 알고 있는 경우 응답을 한 번에 가능한 많은 항목을 처리할 필요가 없습니다. 예를 들어:
#!/usr/bin/expect
proc abort { } { send_user "Timeout!" ; exit 2 }
set address [lindex $argv 0]
spawn telnet $address
expect timeout abort "Login: "
set timeout 5
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "Login incorrect" exit "> "
send "passwd\r"
expect timeout abort "Username: "
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "New Password: "
send "n3wp@ss\r"
expect timeout abort "Confirm New Password: "
send "n3wp@ss\r"
expect timeout abort "> "
send "save\r"
expect timeout abort "> "
send "quit\r"
expect timeout abort eof
abort
이 스크립트는 메시지를 인쇄하고 호출 시 반환 코드 2로 종료되는 함수를 만듭니다 . 변수를 address
스크립트에 전달된 첫 번째 인수로 설정합니다. telnet 명령을 시작한 다음 expect
로그인 프롬프트를 수행하거나 시간 초과됩니다(기본 시간 초과는 10초입니다. 나중에 5초로 설정하겠습니다). timeout
패턴이 아닌 특별한 키워드입니다. Expect 명령의 형식은 다음과 같습니다.모드 명령모드 명령.... 마지막 명령은 생략할 수 있습니다. 즉, 스크립트의 다음 줄로 이동합니다. 이는 여러 줄에 해당합니다.
expect {
timeout abort
"Login incorrect" exit
"> "
}
로그인 프롬프트가 표시되지 않으면 시간 초과로 인해 중단 및 종료가 호출되며, bash 스크립트에서 이 실패를 테스트할 수 있습니다.
메시지가 표시되면 사용자 ID와 비밀번호를 차례로 보내드립니다. "잘못된 로그인"이 수신되면 종료됩니다(종료 코드 0). 이는 비밀번호가 기본 비밀번호가 아니라는 의미입니다. 그렇지 않으면 로그인하여 프롬프트를 확인 >
하고 구성을 계속합니다. 마지막에는 quit
연결을 완전히 닫고 expect eof
닫힐 때까지 기다리기 위해 보낼 수 있는 몇 가지 유용한 명령이 있을 수 있습니다.