telnetlib 中各种 read 函数的意义

基本原理

要明白 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()函数返回值:输入字符串地址
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐