DLink 라우터와의 텔넷 통신을 위한 스크립트 예상

DLink 라우터와의 텔넷 통신을 위한 스크립트 예상

다음 스크립트를 사용하여 텔넷을 통해 라우터에 연결하려고 합니다.

#!/usr/bin/expect -f

set timeout 20

# router user name
set name "admin"

# router password
set pass "admin"

# router IP address
set routerip "192.168.1.1"

# Read command as arg to this script
set routercmd "cat /var/1.leases" 

# start telnet
spawn telnet $routerip

# send username & password
expect "username:"
send -- "$name\n"
expect "password:"
send -- "$pass\n"

# get out of ISP's  Stupid menu program, go to shell
expect "TBS>>"
send --  "sh\n"

# execute command
expect -re ".*\$"
send -- "$routercmd\n"

# exit
send -- "^D"

이제 스크립트가 해당 부분까지 잘 작동합니다 send -- "sh\n". ~ $(tilda-space-dollar-space) 와 같은 쉘 프롬프트가 나타납니다 . 그러나 이후에는 명령을 내릴 수 없습니다. 기본적으로 그 이후에는 작동하지 않습니다.

아무도 이유를 말해 줄 수 있나요? 내가 저지르고 있는 실수인가요?

답변1

좋아요. 나는 그것을 깨뜨렸다. expect코드의 마지막 줄 부분 에서 잘못된 패턴 일치로 뭔가를 해야 했습니다 .

제가 가장 먼저 한 일은 autoexpect. 이 도구는 세션을 기록하고 이를 기반으로 스크립트를 생성하는 데 사용됩니다. 이를 위해 먼저 autoexpect패키지( expect-devDebian 기반 시스템의 패키지에서 사용 가능)를 설치한 다음 세션을 기록했습니다.

sudo apt-get install expect-dev          #Since I'm on Ubuntu
autoexpect telnet 192.168.1.1

autoexpect자동으로 스크립트가 생성되었습니다. 이 스크립트를 실행했을 때 명령이 실행될 때까지 도달하고 라우터에서 실행했지만 종료할 수 없었습니다. 이 스크립트에서 힌트를 얻고 예상 매뉴얼 페이지를 읽으면서 마침내 패턴 인식에 문제가 있다는 것을 알아냈습니다. 나는 마침내 그에 따라 스크립트를 수정했고 이것이 마침내 작동하는 것입니다.

#I am mentioning here only the end part of the complete script which was faulty
# execute command
expect "~ \$ "
send -- "$routercmd\r"

expect "~ \$ "
send -- "exit\r"

expect -- "TBS>>"
send -- "exit\r"

expect -- "*Are you sure to logout?*" 
send -- "y"
expect eof

그래서 배운 교훈은 자동으로 스크립트를 생성하는 데 사용해야 한다는 것이었습니다 autoexpect. 그리고 자동 생성된 스크립트에 결함이 있는 경우 해당 부분의 잘못된 패턴 인식이 원인일 가능성이 높습니다 expect.

내 경우 본질적으로 결함이 있는 부분은 다음과 같습니다.

expect -re ".*\$"    #WRONG
expect "~ \$ "       #RIGHT

결함이 있는 부분은 전적으로 귀하가 연락하는 세션에 따라 달라집니다. 텔넷을 통해 메일 서버에 접속하면 다른 출력이 반환되므로 이에 따라 일치해야 합니다.

관련 정보