问题背景
接到一个需求, 使用telnet登录某机器, 然后执行一些命令, 将执行后的结果导出。
实现
使用go实现
- 方案一, 使用exec.Command
在进入telnet后, 部分输出无法读取, 无法进行下去 - 直接使用socket通信, 按照telnet协议的格式发消息, 收消息.
理论上这个肯定是可以的, 但是对telnet协议不熟悉, 自信不够.
摸索了半天, 后来放弃了 - 借助gexpect
这个确实可以, 在我自己的虚拟机上运行成功了. 但是在测试环境服务器上一直不成功, 不懂为什么, 后来无奈放弃了.
使用Python实现
不得不说, python轮子真是多,有个叫telnetlib的库, 就几行代码就可以登录:
# commands是要执行的命令列表
def pull_config_by_telnet(host ='',
port = 23,
username = '',
password = '',
username_prompt ='username:',
password_prompt ='password:',
commands = []):
result = ''
try:
tn = telnetlib.Telnet(host, port)
# input username
tn.read_until(username_prompt)
tn.write(username + "\n")
# input password
tn.read_until(password_prompt)
tn.write(password + "\n")
for cmd in commands:
tn.write(cmd + "\n")
# time.sleep(1) # 这个不用可以吗?
tn.write("exit\n")
result = tn.read_all()
except Exception as e:
stderr_write("err occourred when pull_config_by_telnet:", e)
result = ''
finally:
tn.close()
return result
总结
- 找到合适的工具, 工作才能更高效,
- 不要重复造轮子
- 没事多学学底层(网络, 算法, 操作系统…)
欢迎补充指正!