network & cli & 소켓통신 문제.
안녕하세요. NMS 프로젝트를 하고있는 도중 일어난 문제입니다. 일반적인 문제가 아니라 원하는 해결책을 찾는것도 많이 힙드네요..
혹시 이런 경험이 있으시거나 도움주실 분들의 어드바이스 부탁드립니다.
그럼 질문 시작하겠습니다.
개발관련된 내용은 특정장비에 소켓으로 접속, CLI명령을 통해 장비에 대한 configuration 정보를 받아오는 것입니다.
1. 대상장비 : EnteraSys XP-8600, EnteraSys N7 - 엔테라시스라는 네트웍장비회사의 두대의 제품입니다.
개발서버 : sol9 sparc
2. 사전테스트 : telnet으로 두 장비에 접속하여 id -> password -> enable -> enable password -> config cmd 순으로 명령어를 날립니다.
두장비가 똑같은 방법으로 명령어를 입렵하지는 않지만(XP8600인경우 id는 입력안합니다) 두장비다 CLI로 결과출력을 확인했습니다. 접속했을때의 내용은 다음과 같습니다.
====================================
XP8600 장비
root@host1 # telnet 1.1.1.1
Trying 1.1.1.1...
Connected to 1.1.1.1.
Escape character is '^]'.
----------------------------------------------------------------------
XP-8600 System Software, Version E9.0.7.3
Copyright (c) 2003 Enterasys Networks
System started on 2007-04-01 13:03:12
----------------------------------------------------------------------
Password:
====================================
N7 장비
root@host1 # telnet 1.1.1.2
Trying 1.1.1.2...
Connected to 1.1.1.2.
Escape character is '^]'.
Username:
3. 개발내용 : 소켓으로 해당 장비에 접속합니다. 예를 들어 XP8600이 ip가 10.0.0.1 라 한다면 소켓으로 23번 포트를 사용해 접속합니다.
connnect()가 성공하고 나면 recv()로 데이타를 받아옵니다. recv에서 받아온 문자들의 조합이 "Password:" 까지 떨어지게 되면 다시 send()로 password 문자열을 담아 보냅니다. 그럼 다시 recv() 결과 메시지를 받아옵니다. 이런 순서대로 config 정보까지 받아옵니다.
4. 여기서문제 : N7은 config 정보까지 잘 받아와 지지만 XP8600장비는 안됩니다.
N7, XP8600 두장비 젤처음 recv를 찍어보면 "ecv buf(? ? ? ?)" 이런 이상한 문자를 받아옵니다. 이건 터미날의 정보를 보내고 받고 하면서 첨엔 깨질수 있다고 누군가 그러더군요. N7은 위처럼 문자가 출력된 후에 "Username:" 까지 recv로 받아집니다. 하지만 XP8600은 send까진 되는것을 확인했는데 recv에서 젤 첨에 15바이트 정도 읽어온후 select()의 fd가 0으로 떨어지면서 "Password:" 까지 못읽더라구요.. 원래는 "Password:"까진 읽어 줘야 하는데..
그리고 출력되는 내용이
recv buf(? ? ? ?)
Zterm
터미날은 zterm을 쓰고 있습니다. 분명히 로그에 "()\n" 까지만 출력되게 했는데 개행이 되면서 Zterm이 출력되는군요. 혹시 터미날 프로그램에 무슨 문제가 있을까 싶어서 crt도 써보았지만 crt도 이상한 문자를 출력하면서 안되더군요. select() 함수의 리턴값이 0이 라는 것은 timeout이 난것인데 타임아웃은 5~ 60초까지 주면서 테스트 해보았습니다만 결과는 똑같습니다.
5. 요약을 하자면 같은 회사의 다른 두장비가 있는데 한장비는 전혀 문제없이 되고, 한장비는 안됩니다. 소스에서 로그로 확인해보면 젤 처음 connect() 한후에 약 15바이트의 문자를 읽지만 그 후에 select() 의 리턴값이 0가 되는 현상. timeout 범위를 작게 혹은 크게 해서 해봤지만 동일한 현상. 그리고 recv()의 받은 버퍼 내용에 ???? 이 출력되고 개행이 되면서 Zterm 문자가 찍힌다는거.
여기까지 설명이 빈약하지만 더 상세한 테스트 방법이라던지 도움 주실분 계시면 감사하겠습니다.
...
1) ethereal이나 tcpdump등으로 dump를 떠서 패킷의 흐름을 살펴보고,(터미널로 할때 vs. 프로그램으로 할때)
3) telnet protocol의 초기 핸드쉐이킹에 대한 문서를 찾아서 검토하세요.
2) nc(netcat)같은 프로그램을 사용해서 먼저 사용해 보시는게 좋겠군요.
참고: libexpect kldp에서도 많군요. http://kldp.org/node/68517
한두개 장비할 것도 아닌듯한데요(+?), 적어도 위의 3가지 정도를 사용해보시는게 좋겠습니다.
댓글 달기