问题描述
tl / dr:在使用Python进行的telnet会话中,是否有一种简单的方法来获取命令的输出?
我正在编写Python脚本(使用3.4)来在telnet会话期间自动执行操作。我希望能够远程登录,写入命令行以执行操作,然后从该命令返回输出。我有一个方法,但似乎可以改进它,而且它不是很动态。
我当前的方法:
def telnet_in(ip):
"""Telnets into the device"""
tn = telnetlib.Telnet(ip)
tn.read_until(b"login: ")
tn.write(TEL_PASS)
tn.read_until(PROMPT) # Clear buffer of output
return tn
这将通过telnet进入我的设备,这对我的设置非常有用。 下一部分,我尝试从设备中获取一些信息:
def get_model(ip):
"""Returns the device's model"""
session = telnet_in(ip)
session.write(b"cat " + MODEL_DIR + b"model\r\n")
time.sleep(1) # Give it time to enter buffer
model = session.read_very_eager()
model = model[26:-4] # Clean up output to only return model
model = decode_byte_str(model) # Decode to str
telnet_exit(session)
return model
我注意到/尝试过的几件事:
- 使用tn.write()时必须使用字节str'b'
- 我也必须使用\ r。
没有这些,我不会得到回报,或者会出错。
另外:
- 我从
model = session.read_very_eager()
获得的输出将返回我用于命令的字符串以及命令返回的输出后的提示。我必须将字符串缩小到适当的大小才能得到模型str。 - 鉴于我必须对字符串使用“ b”,因此返回的字符串也是字节字符串,需要进行解码。我用我的encode_byte_str()很好地处理了这个问题:
def decode_byte_str(byte_str):
"""Decodes a byte string using utf-8"""
return byte_str.decode("utf-8")
我能够最终找到所需的字符串,但这似乎是一种复杂的方法,只能获取返回的字符串。另外,该方法不是动态的,并且我必须为要获取的每个信息编写单独的函数,因为我必须将字符串修整为一定的大小。当然,我可以“通过”需要调整的大小,但这实际上是不需要的其他工作。此外,如果我想编写一个函数,该函数接受用户输入的变量,那么在输出之前我不知道要精确调整的量。我想我可以获取str的长度,然后再传递该长度,但这又使应该是简单的任务变得更加复杂。
所以,我的问题是:在使用Python进行的telnet会话中,是否有一种简单的方法来获取命令的输出?另外,我不喜欢使用telnetlib。如果有更好的lib或方法,那么我也愿意接受。
谢谢!
编辑: 这是我的更新版本,如果有人想使用它,直到我们找到一种更简单/更好的方式:
def telnet_in(ip):
"""Telnets into a device"""
tn = telnetlib.Telnet(ip)
tn.read_until(b"login: ")
tn.write(TEL_PASS)
tn.read_until(PROMPT) # Clear buffer of output
return tn
def telnet_exit(session):
"""Exits a telnet session"""
session.write(b"exit\r\n")
def _encode_str(in_str):
"""Encodes a string to a byte string"""
return bytes(in_str,encoding="utf-8")
def _decode_byte_str(byte_str):
"""Decodes a byte string using utf-8"""
return byte_str.decode("utf-8")
def _get_cmd_output(session,cmd_str):
"""Returns output from a command"""
cmd_str_len = len(cmd_str)
bcmd_str = _encode_str(cmd_str) # Encode str to byte str
session.write(bcmd_str)
time.sleep(0.1) # Give it time to enter buffer
cmd_out = session.read_very_eager()
cmd_out = cmd_out[cmd_str_len:PROMPT_LEN] # Trim output to only return command's returned output
cmd_out = _decode_byte_str(cmd_out) # Decode to a str
return cmd_out
def get_model(ip):
"""Returns the device's model"""
session = telnet_in(ip)
cat_model = "cat " + INFO_DIR + "model\r\n"
model = _get_cmd_output(session,cat_model)
telnet_exit(session)
return model
def get_device_id(ip):
"""Returns the device id"""
session = telnet_in(ip)
cat_device_id = "cat " + INFO_DIR + "device_id\r\n"
device_id = _get_cmd_output(session,cat_device_id)
telnet_exit(session)
return device_id
为我的目的工作。我仍然想知道是否已经有一些内置的lib可以处理这些东西。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)