2014-09-22 1 views
1

터미널 창에서 인쇄가 어떻게 작동하는지 이해하는 사람이 있습니까? "사용자 이름 :"터미널 창 (파이썬)에서 텔넷 세션의 출력을 인쇄/표시하는 방법

$ python test_script.py 
    ['test'] 

tn_read 같은 것을해야한다 : 여기 는 스크립트가 터미널에서 실행되는 테스트 스크립트

test_script.py

import telnetlib 
HOST = "10.1.1.151" 
tn = telnetlib.Telnet(HOST) 
tn.open(HOST) 
test_var = ["test"] 
print test_var 
tn_read = tn.read_very_eager() 
print tn_read 

출력이지만 인쇄되지 않습니다 터미널 창에서.

내가 예상된다 내가 무엇을 얻을 인터프리터에서 실행하는 경우 :

>>> tn.read_very_eager() 
'\n\rUser Name : ' 

왜 또는 무엇 스크립트가 터미널에서 호출 다음과 같은 출력을 위해 할 필요가 있겠습니까?

$ python test_script.py 
    ['test'] 
    User Name : 
+1

즉, tn_read.lstrip()을 인쇄하면 더 나은 작업을 수행합니다. –

+0

@ 토니 : 아니, 차이가 없다. – flamenco

+0

@flamenco 아마도'tn.read_not_so_eager()'(단지 예제) 나'tn.read()'와 같은 다른 함수가 있다면 문서를보십시오. – PascalVKooten

답변

5

짧은 대답은 read_until()을 시간 초과와 함께 사용하는 것입니다. 예 :

timeout = 3 # seconds 
tn_read = tn.read_until('User Name :', timeout) 
print repr(tn_read) 

긴 대답은 다음과 같습니다.

read_very_eager()은 비 블로킹이며 이미 사용 가능한 조리 데이터를 반환하지만 데이터가없는 경우는 아무 것도 반환하지 않습니다. 연결을 설정 한 후 비 차단 "읽기"메소드를 너무 빨리 호출하면 읽을 데이터가 없을 수 있으며 read_very_eager()은 빈 문자열 ('')을 반환합니다.

문제는 아마 타이밍과 관련이 있습니다. 읽기는 비 블로킹이며 아직 수신, 처리 및 버퍼링되지 않은 데이터를 반환 할 수 없습니다. 터미널을 통해 상호 작용할 때 명령을 입력하는 데 시간이 걸리므로 타이밍 문제는 알지 못하지만 스크립트를 실행하면 휴먼 지연이 제거되고 타이밍 문제가 분명 해집니다. 그렇지 수도, 다시 ....

import telnetlib 
import time 

HOST = "10.1.1.151" 
tn = telnetlib.Telnet(HOST) 
test_var = ["test"] 
print test_var 
time.sleep(5) 
tn_read = tn.read_very_eager() 
print repr(tn_read) 

스크립트로 위를 실행하면 예상되는 출력을 볼 수 있습니다 : read 메소드를 호출하기 전에 자고보십시오. 대신 여전히 볼 수 있습니다 :

['test'] 
'' 

특히 서버가 텔넷 IAC 시퀀스로 응답 할 수 있습니다. telnetlibread_very_eager() (실제로 모든 읽기 기능)을 호출하기 전에 도착한 경우이 시퀀스를 사용합니다. 이 경우 read_very_eager()은 빈 문자열을 반환합니다. 당신이 연결을 통해 교환되는 것을보고 싶다면

, 당신은 set_debuglevel(1) 호출 할 수

수입 telnetlib

tn = telnetlib.Telnet('library.cedarville.edu') # any old server will do 
tn.set_debuglevel(1) 
tn_read = tn.read_all() 
print repr(tn_read) 

일반적인 출력은 다음과 같습니다 다른의

Telnet(library.cedarville.edu,23): recv '\xff\xfd\x03' 
Telnet(library.cedarville.edu,23): IAC DO 3 
Telnet(library.cedarville.edu,23): recv '\xff\xfb\x03\xff\xfb\x01\xff\xfd\x18\xff\xfd#\xff\xfd$\xff\xfd\x1f' 
Telnet(library.cedarville.edu,23): IAC WILL 3 
Telnet(library.cedarville.edu,23): IAC WILL 1 
Telnet(library.cedarville.edu,23): IAC DO 24 
Telnet(library.cedarville.edu,23): IAC DO 35 
Telnet(library.cedarville.edu,23): IAC DO 36 
Telnet(library.cedarville.edu,23): IAC DO 31 
Telnet(library.cedarville.edu,23): recv '\r\n' 
Telnet(library.cedarville.edu,23): recv 'login: ' 

" 읽기 "기능을 사용하려면 read_until()을 사용해야합니다. 무기한으로 차단하고 싶지 않은 경우 위와 같이 제한 시간을 전달하십시오.

+0

'read_very_eager '를 사용할 때 타이밍 관련이 있습니다! 넌 나를 구했다! – tarabyte

1

네트워킹 장비의 단자에 텔넷 세션의 예 :

HOST = "1.1.1.1" 
PORT = 30001 
TIMEOUT = 3 
PASSWD = "cisco" 
COMMANDS = ["term len 0","show version","show ip route","show run","!!!end!!!"] 

import telnetlib 

tn = telnetlib.Telnet(HOST, PORT, TIMEOUT) 
#tn.set_debuglevel(1) 
tn.write("\r\n\r\n") 
for cmd in COMMANDS: 
    tn.write(cmd+"\r\n") 

print tn.read_until("!!!end!!!\r\n",3) 
tn.close() 
값에 "\ r에"의 실존이는 tn_read 변수에() .lstrip 사용 가치가 있는지 궁금한데
관련 문제