Python Telnetlib库的工作原理及read方法区别
telnetlib 中各种 read 函数的意义基本原理要明白 telnetlib 中各个 read 函数的意义,首先要了解 telnetlib 的工作原理。 telnetlib 首先通过 socket 连接从网络接收数据,把数据存储到自己的 raw queque 中,然后对其进行(telnet 协议相关的)处理(cook)。处理结果存放在 cooked queue 中供应用程序取用。整个过程如下
基本原理
要明白 telnetlib 中各个 read 函数的意义,首先要了解 telnetlib 的工作原理。 telnetlib 首先通过 socket 连接从网络接收数据,把数据存储到自己的 raw queque 中,然后对其进行(telnet 协议相关的)处理(cook)。处理结果存放在 cooked queue 中供应用程序取用。整个过程如下图.
---------, ,----------, ,-----, ,--------, ,-----------,
network |=====>|socket buf|=====>|raw-q|=====>|cooked-q|=====>|application|
---------` `----------` `-----` `--------` `-----------`
| | | | |
| | | | |
| | | |---------------|
| | | read_very_lazy |
| | | |
| | |------------------------------|
| | read_lazy |
| | |
| |------------------------------------------------|
| read_very_eager/read_eager |
| |
|----------------------------------------------------------------|
| read_until/read_all/read_some/expect |
各 read 函数的意义
各种 read 函数的不同就在于它们所包涵的阶段不同。
read_very_lazy
只从 cookedq 读取已处理好的数据。
read_lazy
如果 rawq 有数据,对 rawq 里的数据进行处理,然后从cookedq 中读取处理好的数据。
read_eager
从系统的 socket buffer 接受数据(即非阻塞模式1读取数据)并处理,然后从 cookedq 中读取数据。
read_very_eager
与 read_eager 类似。不同之处在于 read_eager 只要从
获取到的是的是上次获取之后本次获取之前的所有输出,此函数多次调用仅返回一次结果
cookedq 成功读取到数据就返回,而 read_very_eager 会试图读尽可能多的数据。
其它
剩下的 read 函数基本上就是阻塞式等待网络数据,直到读到所需数据。
Telnet实例具有以下方法:
注意:在python3.5 版本以上Telnet类的子函数返回的都是 字节型字符串(b’ '),Python2.7 版本是直接返回字符型字符串;
telnet命令的符号常量为:IAC,DONT,DO,WONT,WILL,SE(子协商结束),NOP(无操作),DM(数据标记),BRK(中断),IP(中断过程),AO中止输出),AYT(你在那里),EC(擦除字符),EL(擦除线),GA(前进),SB(子协商开始);
Telnet.read_until(expected, timeout=None)
读取,直到预期的给定字节字符串(b’ ')或时间超时。
如果找不到匹配项,则返回可用的内容,可能是空字节。如果连接已关闭且没有可用的cooked数据,则引发EOFError。
Telnet.read_all()
读取所有字节类型数据,直到EOF为止;阻止直到连接关闭。
Telnet.read_some()
至少读取一个字节的cooked数据,除非EOF被引发。如果引发EOF,则返回b’ '。如果没有可用数据则阻立即止。
Telnet.read_very_eager()
在I / O(eager)中可以读取无阻塞的所有内容。
如果连接关闭且没有可用的cooked数据,则引发EOFError。如果没有cooked数据则返回b’ '。除非在IAC序列中,否则不要阻止。
Telnet.read_eager()
读取真实有效的数据。
如果连接关闭且没有可用的coked据,则引发EOFError。如果没有cooked数据则返回b’ '。除非在IAC序列中,否则不要阻止。
Telnet.read_lazy()
处理和返回队列中已有的数据(lazy)。
如果连接已关闭且没有可用数据,则引发EOFError。如果没有cooked数据则返回b ’ '。除非在IAC序列中,否则不要阻止。
Telnet.read_very_lazy()
返回在cooked队列中的任何可用数据(very_lazy)。
如果连接已关闭且没有可用数据,则引发EOFError。如果没有cooked数据则返回b’ '。这种方法从不阻止。
Telnet.read_sb_data()
返回在SB / SE对之间收集的数据(子选项开始/结束)。当使用SE命令调用回调时,回调应该访问这些数据。这种方法从不阻止。
Telnet.open(host,port = 0 [,timeout])
连接到主机。可选的第二个参数是端口号,默认为标准Telnet端口(23)。可选的timeout参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。
不要尝试重新打开已连接的实例。
Telnet.msg(msg, args)*
当调试级别> 0时,打印调试消息。如果存在额外的参数,则使用标准字符串格式化运算符在消息中替换它们。
Telnet.set_debuglevel(DEBUGLEVEL)
设置调试级别。 debuglevel的值越高,您获得的调试输出就越多(在sys.stdout上)。
Telnet.close()
关闭连接。
Telnet.get_socket()
返回内部使用的套接字对象。
Telnet.fileno()
返回内部使用的套接字对象的文件描述符。
Telnet.write(buffer)
将一个字节字符串写入套接字,使任何IAC字符加倍。如果连接被阻止,这可能会阻止。如果连接关闭,可能会引发OSError。
版本3.3中更改:此方法用于引发socket.error,它现在是OSError的别名。
Telnet.interact()
交互功能,模拟一个非常愚蠢的Telnet客户端。
Telnet.mt_interact()
多线程版本的interact()。
Telnet.expect(list,timeout = None)
直到读取正则表达式列表中的一个匹配。
第一个参数是正则表达式列表,可以是已编译的(正则表达式对象),也可以是未编译的(字节串)。可选的第二个参数是超时,以秒为单位;默认是无限期阻止。
返回三个元组的元组:匹配的第一个正则表达式列表中的索引;匹配对象返回;并且读取的字节直到包括匹配。
如果找到文件末尾并且没有读取任何字节,则引发EOFError。否则,当没有匹配时,返回(-1,None,data)数据是到目前为止接收的字节(如果发生超时,则可能是空字节)。
如果正则表达式以贪婪匹配(例如。*)结束,或者如果多个表达式可以匹配相同的输入,则结果是非确定性的,并且可能取决于I / O时序。
Telnet.set_option_negotiation_callback(回调)
每次在输入流上读取telnet选项时,将使用以下参数调用此回调(如果已设置):callback(telnet socket,命令(DO / DONT / WILL / WONT),选项)。之后telnetlib没有做任何其他操作。
getpass()函数用于从控制台输入一行字符串,关闭了回显(输入时不显示输入的字符串),适用于用密码的输入。
语法 char * getpass (const char * prompt);
参数prompt为提示字符串地址。
getpass()函数返回值:输入字符串地址
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)