나는이 같은 문제의 발견 - telnetlib 메시지에서 모든 × 00을 억제하는 것입니다. 프레드릭 요한슨 (Fredrik Johansson)은 잘 대답 했으므로 telnetlib가 구현 된 방식입니다.
하나 개의 솔루션은 모든 null 문자를 먹지 않는 telnetlib의 텔넷 클래스의 process_rawq()
기능을 무시하는 것입니다 :
import telnetlib
from telnetlib import IAC, DO, DONT, WILL, WONT, SE, NOOPT
def _process_rawq(self):
"""Alteração da implementação desta função necessária pois telnetlib suprime 0x00 e \021 dos dados lidos
"""
buf = ['', '']
try:
while self.rawq:
c = self.rawq_getchar()
if not self.iacseq:
# if c == theNULL:
# continue
# if c == "\021":
# continue
if c != IAC:
buf[self.sb] = buf[self.sb] + c
continue
else:
self.iacseq += c
elif len(self.iacseq) == 1:
# 'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]'
if c in (DO, DONT, WILL, WONT):
self.iacseq += c
continue
self.iacseq = ''
if c == IAC:
buf[self.sb] = buf[self.sb] + c
else:
if c == SB: # SB ... SE start.
self.sb = 1
self.sbdataq = ''
elif c == SE:
self.sb = 0
self.sbdataq = self.sbdataq + buf[1]
buf[1] = ''
if self.option_callback:
# Callback is supposed to look into
# the sbdataq
self.option_callback(self.sock, c, NOOPT)
else:
# We can't offer automatic processing of
# suboptions. Alas, we should not get any
# unless we did a WILL/DO before.
self.msg('IAC %d not recognized' % ord(c))
elif len(self.iacseq) == 2:
cmd = self.iacseq[1]
self.iacseq = ''
opt = c
if cmd in (DO, DONT):
self.msg('IAC %s %d',
cmd == DO and 'DO' or 'DONT', ord(opt))
if self.option_callback:
self.option_callback(self.sock, cmd, opt)
else:
self.sock.sendall(IAC + WONT + opt)
elif cmd in (WILL, WONT):
self.msg('IAC %s %d',
cmd == WILL and 'WILL' or 'WONT', ord(opt))
if self.option_callback:
self.option_callback(self.sock, cmd, opt)
else:
self.sock.sendall(IAC + DONT + opt)
except EOFError: # raised by self.rawq_getchar()
self.iacseq = '' # Reset on EOF
self.sb = 0
pass
self.cookedq = self.cookedq + buf[0]
self.sbdataq = self.sbdataq + buf[1]
telnetlib.Telnet.process_rawq = _process_rawq
다음 텔넷 클래스를 오버라이드 (override) '을 방법 :
telnetlib.Telnet.process_rawq = _process_rawq
이 나를 위해 문제를 해결했다.
나는 그들을 시험해 보았지만 해결책이 아닙니다. 내가 그들을 사용할 때, 나는 타임 아웃을 설정해야만했으며,이 경우 타임 아웃을 기다릴 때마다 기다렸다가 많은 양의 데이터를 보낼 때 충분히 효율적이지 못했다. 그리고 그 시간 초과 후에 응답을 포착하지 못할 수도 있습니다. timeout을 설정하지 않으면 알 수없는 시간 동안 연결이 차단됩니다. – brian
나는 당신이 read_until (... timeout = timeout)에서 시간 제한을 설정할 수 있다고 생각한다. 원본 파일에 을 사용하면 기본적으로 일치하는 항목에 대해 '찾기'가 사용되므로 read_until ("\ x00")이 작동해야합니다. – Anzel