Python使用Telnetlib模块实现telnet远程操作

来源:互联网 发布:淘宝客服外包价格 编辑:程序博客网 时间:2024/06/05 15:30

Python使用Telnetlib实现远程操作


Python内置了telnetlib模块,支持telnet远程操作,只要直接import就可以。

下面是一个实例(参考http://blog.csdn.net/five3/article/details/8099997):

[python] view plain copy
  1. #encoding=utf-8  
  2.   
  3. def do_telnet(Host, username, password, finish, commands):  
  4.     import telnetlib  
  5.     '''''Telnet远程登录:Windows客户端连接Linux服务器'''  
  6.    
  7.     # 连接Telnet服务器  
  8.     tn = telnetlib.Telnet(Host, port=23, timeout=10)  
  9.     tn.set_debuglevel(2)  
  10.        
  11.     # 输入登录用户名  
  12.     tn.read_until('login: ')  
  13.     tn.write(username + '\n')  
  14.       
  15.     # 输入登录密码  
  16.     tn.read_until('password: ')  
  17.     tn.write(password + '\n')  
  18.         
  19.     # 登录完毕后执行命令  
  20.     tn.read_until(finish)  
  21.     for command in commands:  
  22.         tn.write('%s\n' % command)  
  23.       
  24.     #执行完毕后,终止Telnet连接(或输入exit退出)  
  25.     tn.read_until(finish)  
  26.     tn.close() # tn.write('exit\n')  
  27.   
  28. if __name__=='__main__':  
  29.      # 配置选项  
  30.     Host = '10.255.254.205' # Telnet服务器IP  
  31.     username = 'administrator'   # 登录用户名  
  32.     password = 'dell1950'  # 登录密码  
  33.     finish = ':~$ '      # 命令提示符  
  34.     commands = ['echo "test"']  
  35.     do_telnet(Host, username, password, finish, commands)  
其中port和timeout是可选的参数,而timeout的只是在初始化socket连接时起作用,而一旦连接成功后如果出现等待那就不会起作用了,比如使用read_until方式获取内容时返回的内容与指定的内容没有吻合,那么就会造成提示等待的情况,这时timeout是不会起作用的,而这个socket连接会一直保持着,永生不死。

那么如何解决这个问题呢,其实还有一种比较原始的方法,就是使用sleep方法来代替read_until方法,这样就不会出现种情况,因为到点就会自己输入,最多也就是最后得不到想要的结果,但是这个方式很不稳定,兼容性也不好;另一种方法是使用线程来启动这个函数,然后对子线程进行超时设置,这样就可以达到间接控制这个telnet连接的目的了。

[python] view plain copy
  1. import threading  
  2. pars = replace_db_keyworlds(vars_dict, pars)  
  3. configs = pars.split(r'@')  
  4. host = configs[0].encode()  
  5. user = configs[1]  
  6. passwd = configs[2]  
  7. finish = configs[3]  
  8. commands = configs[4].split(r'\n')  
  9. th1 = threading.Thread(target=do_telnet, args=(host.encode('utf-8'), user.encode('utf-8'), passwd.encode('utf-8'), finish.encode('utf-8'), commands))  
  10. th1.start()  
  11. th1.join(20)  ##20秒超时时间  
遇到的问题:


传递给Telnet方法的字符串都会被解一次码,所以如果你传递过去需要write的字符串是已经解码的unicode的话,那么就会报错的,所以在传递发送的字符串之前还是先编成utf-8为妥,用ascii编码也可以


我用python3搭建了一个环境,telnet到嵌入式linux系统时,报如下错误信息:


TypeError: 'in <string>' requires string as left operand, not bytes


解决办法:

encode()函数将字符串编码就可以了,比如tn.read_until('login: '.encode('utf-8')) 就可以解决。
又如(具体见https://docs.python.org/3/library/telnetlib.html):

import getpassimport telnetlibHOST = "localhost"user = input("Enter your remote account: ")password = getpass.getpass()tn = telnetlib.Telnet(HOST)tn.read_until(b"login: ")tn.write(user.encode('ascii') + b"\n")if password:    tn.read_until(b"Password: ")    tn.write(password.encode('ascii') + b"\n")tn.write(b"ls\n")tn.write(b"exit\n")print(tn.read_all().decode('ascii'))


 

此外,还有一个pexpect的第三方模块可以支持telnet等一系列的协议连接,并支持交互式的通信。


参考博客:http://blog.csdn.net/five3/article/details/8099997


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 别人知道自己京东的账号密码怎么办 oppo手机刷机要锁屏密码怎么办 在苏宁易购退款成功又收到货怎么办 今日头条转发出现未安装微信怎么办 打开手机后自动弹出广告怎么办去除 朋友圈发广告被腾讯屏蔽了怎么办 新商盟手机订烟登录密码忘了怎么办 手机版战神斯巴达幽灵经常崩怎么办 代购买的东西被海关扣了怎么办 托朋友代购给了钱联系不上人怎么办 签了合同被加盟商骗了怎么办 百度云盘下载时本地空间不足怎么办 百度云盘隐私空间没密码忘了怎么办 华为云空间的帐号密码忘记了怎么办 快递被快递公司弄丢了怎么办 快递到了人不在那个地方了怎么办 微信被骗了1千多怎么办 客户货已经用啦要求退款退货怎么办 网购收到别人退货的东西怎么办 好省输入订单编号查不到订单怎么办 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办