짧은 대답은 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 시퀀스로 응답 할 수 있습니다. telnetlib
은 read_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()
을 사용해야합니다. 무기한으로 차단하고 싶지 않은 경우 위와 같이 제한 시간을 전달하십시오.
즉, tn_read.lstrip()을 인쇄하면 더 나은 작업을 수행합니다. –
@ 토니 : 아니, 차이가 없다. – flamenco
@flamenco 아마도'tn.read_not_so_eager()'(단지 예제) 나'tn.read()'와 같은 다른 함수가 있다면 문서를보십시오. – PascalVKooten