2015-01-27 4 views
2

Python의 telnetlib 모듈을 사용하여 장치와 통신하려고합니다. 연결을 설정하고 내 쿼리를 장치에 전달할 수있는 것 같지만 출력은 예상 한 것과 다릅니다. 여기 파이썬의 텔넷 쿼리에서 여러 줄을 읽으려면 어떻게해야합니까?

내 단순화 코드 :

import telnetlib 
import time 

HOST = "10.10.10.71" 

tn = telnetlib.Telnet(HOST, port=55555, timeout=60) 

time.sleep(5)    # Give the processor time to connect 

tn.write(b'v' + b'\r\n')  # Get the processor version, using 'v' 

print(tn.read_eager().decode('utf-8')) 

tn.close()     # Close the connection 

이 코드를 실행 한 후, 모든 단말 디스플레이는 : MPA :? - 내가 예상했던 프로세서 정보가 아닙니다.

텔넷 클라이언트를 사용하면 연결을 설정 한 후 mpa :?가 나타납니다. 프롬프트에서 장치가 내 명령에 대한 준비가되었음을 나타냅니다. 나는 그 때이 형식으로 출력을 생성해야하는 'V'를 입력 : 질의 후

mpa:? v 

FIRMWARE CONFIGURATION: 
Processor Firmware Type 
Build Number 
Copyright Info 

HARDWARE CONFIGURATION: 
Line 1   - xxxx 
Line 2   - xxxx 
Line 3   - xxxx 
... 

mpa:? 

MPA를 :? 프롬프트가 표시되면 다음 명령을 준비하십시오.

print(tn.read_eager().decode('utf-8')) 대신에, 나는 또한 print(tn.read_all().decode('utf-8'))을 시도했지만 한 다음과 같은 오류 메시지가 출력이 시간 :

Traceback (most recent call last): 
File "C:/Python/Telnet_logger_1.py", line 14, in <module> 
print(tn.read_all().decode('utf-8')) 
File "C:\Python34\lib\telnetlib.py", line 335, in read_all 
self.fill_rawq() 
File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq 
buf = self.sock.recv(50) 
socket.timeout: timed out 

사람이 올바른 방향으로 날 지점, 또는 알려 수 있을까 내가 내가 잘못 했니?

많은 감사합니다.

나는 새로운 라인과 캐리지 리턴 후 각 라인을 인쇄하는 동안 루프를 추가하여 문제를 해결 한
+0

:?' 명령을 보내기 전에 장치가 반환 한 프롬프트 [docs] (https://docs.python.org/3/library/telnetlib.html)에있는 예제와 비슷한'tn.read_until (b "mpa :?")'과 같은 것을 시도해 보셨습니까? –

+0

@ PM2Ring - 귀하의 제안에 감사드립니다. 나는'time.sleep (5)'을 제거하려고 시도하고 그것을'tn.read_until (b "mpa :?")'로 바꿨다. - 나는 tn.read_all()을 사용할 때 여전히 타임 아웃 에러를 얻는다. tn.read_eager(), 전혀 출력이 없습니다. – skyhammer

+0

나는 무엇을 제안해야할지 모르겠다. telnetlib에 대한 경험이 제한되어 있지만 Python 2.6에서 성공적으로 사용하여 ADSL 모뎀과 통신했습니다. 모뎀은 항상 명령 프롬프트로 출력을 종료하기 때문에'tn.read_until (프롬프트)'를 사용하여 데이터를 읽습니다. –

답변

2

은에서 읽은 : 난 당신이`MPA를 읽을 필요가 있다고 의심

import telnetlib 

HOST = "10.10.10.71" 

tn = telnetlib.Telnet(HOST, port=55555, timeout=60) 

tn.read_until(b"mpa:?") 

tn.write(b'v' + b'\n\r') 

while True: 
    line = tn.read_until(b"\n\r") # Check for new line and CR 
    print(line) 
    if (b"mpa:?") in line: # If last read line is the prompt, end loop 
     break 

tn.close() 
관련 문제