Python telnetlib read_until returns 切断字符串
Python telnetlib read_until returns cut off string
[Python telnetlib read_until recv 问题]
"read_until" 函数 returns 用长命令截断字符串。
命令运行完美,但不显示全文。
我怎样才能解决这个问题?请帮忙。
#我的代码
tn = telnetlib.Telnet(ip, 23, 5)
prompt = ']# '
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
print tn.read_until(prompt, 1)
#调试输出
Telnet(192.168.220.4,23): 发送'echo "this is a long command for the test purpose... > test.txt"\n'
Telnet(192.168.220.4,23): recv 'echo "this is a l'
Telnet(192.168.220.4,23): recv 'ong command for the test purpose... > te\r\x00<his is '
Telnet(192.168.220.4,23): recv 'a long command for the test purpose... > tes '
Telnet(192.168.220.4,23): recv ' \x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0
8t.txt"'
Telnet(192.168.220.4,23): recv '\r\nthis is a long command for the test purpose... >'
Telnet(192.168.220.4,23): recv ' test.txt\r\n[root@RHEL6-5 tmp]# '
#真实输出
<这是用于测试目的的长命令...> test.txt"
这是用于测试目的的长命令...> test.txt
[root@RHEL6-5 tmp]#
问题似乎是由换行引起的。
我找到了一个解决方案,其中将 window 大小宽度设置为接近最大值允许接收长行而无需 telnet 服务器应用换行。
(有关设置选项 https://www.ietf.org/rfc/rfc1073.txt 的详细信息,请参阅 Window 大小选项 RFC)
import telnetlib
import struct
from telnetlib import DO, DONT, IAC, WILL, WONT, NAWS, SB, SE
MAX_WINDOW_WIDTH = 65000 # Max Value: 65535
MAX_WINDOW_HEIGHT = 5000
def set_max_window_size(tsocket, command, option):
"""
Set Window size to resolve line width issue
Set Windows size command: IAC SB NAWS <16-bit value> <16-bit value> IAC SE
--> inform the Telnet server of the window width and height.
Refer to https://www.ietf.org/rfc/rfc1073.txt
:param tsocket: telnet socket object
:param command: telnet Command
:param option: telnet option
:return: None
"""
if option == NAWS:
width = struct.pack('H', MAX_WINDOW_WIDTH)
height = struct.pack('H', MAX_WINDOW_HEIGHT)
tsocket.send(IAC + WILL + NAWS)
tsocket.send(IAC + SB + NAWS + width + height + IAC + SE)
# -- below code taken from telnetlib source
elif command in (DO, DONT):
tsocket.send(IAC + WONT + option)
elif command in (WILL, WONT):
tsocket.send(IAC + DONT + option)
ip = 'x.x.x.x'
tn = telnetlib.Telnet(ip, 23, timeout=5)
tn.set_option_negotiation_callback(set_max_window_size)
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
prompt = ']# '
print tn.read_until(prompt, timeout=1)
为我工作。
def set_max_window_size(tsocket, command, option):
"""
Set Window size to resolve line width issue
Set Windows size command: IAC SB NAWS <16-bit value> <16-bit value> IAC SE
--> inform the Telnet server of the window width and height.
Refer to https://www.ietf.org/rfc/rfc1073.txt
:param tsocket: telnet socket object
:param command: telnet Command
:param option: telnet option
:return: None
"""
if option == NAWS:
naws_command = struct.pack('!BBBHHBB',
255, 250, 31, # IAC SB NAWS
50, 100, #width, height
255, 240) # IAC SE
tsocket.send(naws_command)
# -- below code taken from telnetlib source
elif command in (DO, DONT):
tsocket.send(IAC + WONT + option)
elif command in (WILL, WONT):
tsocket.send(IAC + DONT + option)
ip = 'x.x.x.x'
tn = telnetlib.Telnet(ip, 23, timeout=5)
socket = tn.get_socket()
tn.set_option_negotiation_callback(set_max_window_size)
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
prompt = ']# '
print tn.read_until(prompt, timeout=1)
[Python telnetlib read_until recv 问题]
"read_until" 函数 returns 用长命令截断字符串。
命令运行完美,但不显示全文。
我怎样才能解决这个问题?请帮忙。
#我的代码
tn = telnetlib.Telnet(ip, 23, 5)
prompt = ']# '
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
print tn.read_until(prompt, 1)
#调试输出
Telnet(192.168.220.4,23): 发送'echo "this is a long command for the test purpose... > test.txt"\n'
Telnet(192.168.220.4,23): recv 'echo "this is a l'
Telnet(192.168.220.4,23): recv 'ong command for the test purpose... > te\r\x00<his is '
Telnet(192.168.220.4,23): recv 'a long command for the test purpose... > tes '
Telnet(192.168.220.4,23): recv ' \x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0
8t.txt"'
Telnet(192.168.220.4,23): recv '\r\nthis is a long command for the test purpose... >'
Telnet(192.168.220.4,23): recv ' test.txt\r\n[root@RHEL6-5 tmp]# '
#真实输出
<这是用于测试目的的长命令...> test.txt"
这是用于测试目的的长命令...> test.txt
[root@RHEL6-5 tmp]#
问题似乎是由换行引起的。 我找到了一个解决方案,其中将 window 大小宽度设置为接近最大值允许接收长行而无需 telnet 服务器应用换行。
(有关设置选项 https://www.ietf.org/rfc/rfc1073.txt 的详细信息,请参阅 Window 大小选项 RFC)
import telnetlib
import struct
from telnetlib import DO, DONT, IAC, WILL, WONT, NAWS, SB, SE
MAX_WINDOW_WIDTH = 65000 # Max Value: 65535
MAX_WINDOW_HEIGHT = 5000
def set_max_window_size(tsocket, command, option):
"""
Set Window size to resolve line width issue
Set Windows size command: IAC SB NAWS <16-bit value> <16-bit value> IAC SE
--> inform the Telnet server of the window width and height.
Refer to https://www.ietf.org/rfc/rfc1073.txt
:param tsocket: telnet socket object
:param command: telnet Command
:param option: telnet option
:return: None
"""
if option == NAWS:
width = struct.pack('H', MAX_WINDOW_WIDTH)
height = struct.pack('H', MAX_WINDOW_HEIGHT)
tsocket.send(IAC + WILL + NAWS)
tsocket.send(IAC + SB + NAWS + width + height + IAC + SE)
# -- below code taken from telnetlib source
elif command in (DO, DONT):
tsocket.send(IAC + WONT + option)
elif command in (WILL, WONT):
tsocket.send(IAC + DONT + option)
ip = 'x.x.x.x'
tn = telnetlib.Telnet(ip, 23, timeout=5)
tn.set_option_negotiation_callback(set_max_window_size)
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
prompt = ']# '
print tn.read_until(prompt, timeout=1)
为我工作。
def set_max_window_size(tsocket, command, option):
"""
Set Window size to resolve line width issue
Set Windows size command: IAC SB NAWS <16-bit value> <16-bit value> IAC SE
--> inform the Telnet server of the window width and height.
Refer to https://www.ietf.org/rfc/rfc1073.txt
:param tsocket: telnet socket object
:param command: telnet Command
:param option: telnet option
:return: None
"""
if option == NAWS:
naws_command = struct.pack('!BBBHHBB',
255, 250, 31, # IAC SB NAWS
50, 100, #width, height
255, 240) # IAC SE
tsocket.send(naws_command)
# -- below code taken from telnetlib source
elif command in (DO, DONT):
tsocket.send(IAC + WONT + option)
elif command in (WILL, WONT):
tsocket.send(IAC + DONT + option)
ip = 'x.x.x.x'
tn = telnetlib.Telnet(ip, 23, timeout=5)
socket = tn.get_socket()
tn.set_option_negotiation_callback(set_max_window_size)
tn.write('echo "this is a long command for the test purpose... > test.txt"\n')
prompt = ']# '
print tn.read_until(prompt, timeout=1)