找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2086|回复: 0

[已解决] 新手学习一:利用telnetlib访问windows系统的TelNet服务器

1

主题

2

帖子

2

积分

贫民

积分
2
coobozhu 发表于 2021-5-24 20:41:38 | 显示全部楼层 |阅读模式
本帖最后由 coobozhu 于 2021-5-24 20:50 编辑

(第一次写,没有记录所查网上信息的原文链接,以后我会注意保留)新手经验交流一:利用telnetlib访问windows系统的TelNet服务器
网上有许多介绍使用telnetlib模块用法的文章,大多介绍差不多,在访问windows系统的telnet服务器时,会发现,用网上的方法很难将程序基本功能跑通。总结有几个误区:
1、telnetlib的通信不是字符串信息,而是新的数据类型:字节数据,字节数据与字符串数据的相互转换网上有大量资料介绍,可以相互转换,但在读取远程TELNET服务器信息后,要将字节型数据转换为可读的字符型数据时,用decode('utf-8')通常会报错:'utf-8' codec can't decode byte 0xc7 in position 9: invalid continuation byte,一位网友分享了计算字符集的变迁,建议用‘gb2312',本人用了decode('gd2312'),问题解决。
2、按网上众多文档介绍,写入了PASSWORD后,就可以输入DOS命令了,我反复试验都没有成功,后来将PYTHON程序下的TELNET操作与DOS SHELL下进行TELNET两种情况进行网络抓包,对比发现,输入PASSWORD后,中间客户端与服务器端还进行好几次通信,试想可能与WINDOWS有关,再以此去查资料,有网友给了一个很好的办法,下面FOR语句,就是解决这个问题的,FOR语句结束,才算是登陆结束,进入命令行待输入状态。FOR语句,其功能是将WINDows的欢迎语句展现出来:
(回车)
(回车)
*===============================================================
Microsoft Telnet Server.
*===============================================================

PYTHON的telnetlib模块是语言自带的模块,不用安装,可以直接加载:

import telnetlib
import time

h = '192.168.2.2'
u = bytes('administrator',encoding='utf-8')
p = bytes('123',encoding='utf-8')

tn = telnetlib.Telnet(h)
tn.read_until(b'login: ')
tn.write(u + b'\r\n')
tn.read_until(b'password: ')
tn.write(p + b'\r\n')

time.sleep(1)
for i in range(5):
    tn.write(b'\n')

tn.read_until(b'>')
tn.write(b'dir f:\r\n')
time.sleep(1)
tmp = tn.read_very_eager()
tmp1 = tmp.decode('gb2312')
print(tmp1) #形成字符串,可以用正则表达式进行进一步处理

time.sleep(1) #为什么用read_until(b'>'),程序挂起不能正常运行?

tn.write(b'dir c:\r\n')
time.sleep(1)
tmp = tn.read_very_eager()
tmp2 = tmp.decode('gb2312')
print(tmp2) #形成字符串,可以用正则表达式进行进一步处理

tn.close()

红色部分,是我的一个问题,没想明白,我用的是VSCode

输出结果为DOS SHELL下的结果与格式,限于篇幅,省略。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表