'예상'내부의 조건부 진술 사용
-
20-09-2019 - |
문제
텔넷 세션에 로그인을 자동으로 자동으로 자동화해야합니다. 예상하다, 그러나 동일한 사용자 이름에 대해 여러 암호를 처리해야합니다.
내가 만들어야 할 흐름은 다음과 같습니다.
- 텔넷 세션을 IP로 열었습니다
- 사용자 이름을 보냅니다
- 비밀번호를 보내십시오
- 잘못된 비밀번호? 동일한 사용자 이름을 다시 보내고 다른 비밀번호를 보내십시오.
- 이 시점에서 성공적으로 로그인했을 것입니다 ...
가치가있는 것에 대해, 여기 지금까지 내가 얻은 것들이 있습니다.
#!/usr/bin/expect
spawn telnet 192.168.40.100
expect "login:"
send "spongebob\r"
expect "password:"
send "squarepants\r"
expect "login incorrect" {
expect "login:"
send "spongebob\r"
expect "password:"
send "rhombuspants\r"
}
expect "prompt\>" {
send_user "success!\r"
}
send "blah...blah...blah\r"
말할 것도없이 이것이 효과가 없으며 매우 예쁘지도 않습니다. Google과의 모험에서 예상하다 어두운 예술가 인 것 같습니다. 문제에 대한 도움을 주신 사람에게 미리 감사드립니다!
해결책
다시 말해야합니다 기대를 탐구합니다 모든 예상 프로그래머를위한 예약 - 귀중한.
코드를 다시 작성했습니다 : (Untested)
proc login {user pass} {
expect "login:"
send "$user\r"
expect "password:"
send "$pass\r"
}
set username spongebob
set passwords {squarepants rhombuspants}
set index 0
spawn telnet 192.168.40.100
login $username [lindex $passwords $index]
expect {
"login incorrect" {
send_user "failed with $username:[lindex $passwords $index]\n"
incr index
if {$index == [llength $passwords]} {
error "ran out of possible passwords"
}
login $username [lindex $passwords $index]
exp_continue
}
"prompt>"
}
send_user "success!\n"
# ...
exp_continue
기대 블록의 시작 부분으로 돌아가는 것은 "redo"문과 같습니다.
주목하십시오 send_user
로 끝나다 \n
~ 아니다 \r
당신은 탈출 할 필요가 없습니다 >
프롬프트의 캐릭터 : TCL은 특별하지 않습니다.
다른 팁
약간의 강타로 나는 해결책을 찾았다. 기대가 전혀 익숙하지 않은 TCL 구문을 사용한다는 것이 밝혀졌습니다.
#!/usr/bin/expect
set pass(0) "squarepants"
set pass(1) "rhombuspants"
set pass(2) "trapezoidpants"
set count 0
set prompt "> "
spawn telnet 192.168.40.100
expect {
"$prompt" {
send_user "successfully logged in!\r"
}
"password:" {
send "$pass($count)\r"
exp_continue
}
"login incorrect" {
incr count
exp_continue
}
"username:" {
send "spongebob\r"
exp_continue
}
}
send "command1\r"
expect "$prompt"
send "command2\r"
expect "$prompt"
send "exit\r"
expect eof
exit
바라건대 이것은 다른 사람들에게 유용 할 것입니다.
사용자 ID와 암호를 알고 있다면 어떤 userID/암호 쌍이 어떤 시스템과 정렬되어 있는지 알아야합니다. 나는 당신이 어떤 userID/비밀번호 쌍이 어떤 시스템을 추출한 다음 해당 정보를 추출하고 단순히 올바른 정보를 사용하는지의 맵을 유지하는 것이 더 나을 것이라고 생각합니다.
그래서 - 당신은 분명히 내 조언을 좋아하지 않기 때문에, 나는 당신이 Wikipedia 페이지 성공한 경우 0을 반환하고 기대 시간이 소요되는 경우 1을 반환하는 절차를 구현하십시오. 이를 통해 제공된 비밀번호가 실패했을 때 (신속한 기대 시간이 떨어지고) 재 시도 할 수 있습니다. 이것이 도움이되면 편집 한 지금 다운 보트를 제거 할 수 있습니다.
돌이켜 보면, 비밀번호가 변경되면 로그인이 실패한 것을 감지하고 싶기 때문에 어쨌든 맵과 함께이 작업을 수행하고 싶을 것입니다.