문제

텔넷 세션에 로그인을 자동으로 자동으로 자동화해야합니다. 예상하다, 그러나 동일한 사용자 이름에 대해 여러 암호를 처리해야합니다.

내가 만들어야 할 흐름은 다음과 같습니다.

  1. 텔넷 세션을 IP로 열었습니다
  2. 사용자 이름을 보냅니다
  3. 비밀번호를 보내십시오
  4. 잘못된 비밀번호? 동일한 사용자 이름을 다시 보내고 다른 비밀번호를 보내십시오.
  5. 이 시점에서 성공적으로 로그인했을 것입니다 ...

가치가있는 것에 대해, 여기 지금까지 내가 얻은 것들이 있습니다.

#!/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을 반환하는 절차를 구현하십시오. 이를 통해 제공된 비밀번호가 실패했을 때 (신속한 기대 시간이 떨어지고) 재 시도 할 수 있습니다. 이것이 도움이되면 편집 한 지금 다운 보트를 제거 할 수 있습니다.

돌이켜 보면, 비밀번호가 변경되면 로그인이 실패한 것을 감지하고 싶기 때문에 어쨌든 맵과 함께이 작업을 수행하고 싶을 것입니다.

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