Python telnetlib:令人惊讶的问题

Posted

技术标签:

【中文标题】Python telnetlib:令人惊讶的问题【英文标题】:Python telnetlib: surprising problem 【发布时间】:2011-04-29 09:28:09 【问题描述】:

我正在使用 Python 模块 telnetlib 来创建一个 telnet 会话(使用国际象棋服务器),但我遇到了一个我真的无法解决的问题。以下代码完美运行:

>>> f = login("my_server") #code for login(host) below.
>>> f.read_very_eager()

这会吐出服务器通常在登录时打印的所有内容。但是,当我把它放在一个函数中然后这样调用它时:

>>> def foo():
...   f = login("my_server")
...   return f.read_very_eager()
...
>>> foo()

我什么也没得到(空字符串)。我可以检查登录是否正确执行,但由于某种原因我看不到文本。那么它在哪里被吞噬呢?

非常感谢。

为了完整起见,这里是登录名(主机):

def login(host, handle="guest", password=""):
try:
    f = telnetlib.Telnet(host) #connect to host
except:
    raise Error("Could not connect to host")
f.read_until("login: ")
try:
    f.write(handle + "\n\r")
except:
    raise Error("Could not write username to host")
if handle == "guest":
    f.read_until(":\n\r")
else:
    f.read_until("password: ")
try:
    f.write(password + "\n\r")
except:
    raise Error("Could not write password to host")
return f

【问题讨论】:

我发现如果我使用 read_very_eager() 而不是 read_until(),它确实有效。应该是关于协议和数据传输方式的东西,我没有必要的技术背景。 【参考方案1】:

这在您手动尝试时有效但在函数中无效的原因是,当您手动尝试时,服务器有足够的时间对登录做出反应并将数据发回。当这一切都在一个功能中时,您将密码发送到服务器,并且永远不会等待足够长的时间让服务器回复。

如果您更喜欢(可能更正确的)技术答案:

在文件 telnetlib.py(我的 Windows 计算机上的 c:\python26\Lib\telnetlib.py)中,函数 read_very_eager(self) 调用 self.sock_avail() 现在,函数 sock_avail(self) 执行以下操作:

def sock_avail(self):
    """Test whether data is available on the socket."""
    return select.select([self], [], [], 0) == ([self], [], [])

这样做非常简单:如果有 -anything- 从我们的套接字读取(服务器已响应),它将返回 True,否则将返回 False。

所以,read_very_eager(self) 所做的是:检查是否有任何内容可供阅读。如果有,则从套接字中读取,否则返回一个空字符串。

如果您查看read_some(self) 的代码,您会发现它不会检查是否有任何数据可供读取。它会尝试读取直到有可用的东西,这意味着如果服务器在回答你之前需要例如 100 毫秒,它会在返回答案之前等待 100 毫秒。

【讨论】:

【参考方案2】:

我遇到了和你一样的麻烦,不幸的是select.select的组合,我在一个while循环中直到我能够阅读,然后调用read_some()对我不起作用,仍然只能阅读实际产量的 1%。如果我在阅读之前打开 time.sleep(10) 并执行 read_very_eager() 似乎可以工作...这是一种非常粗略的做事方式,但确实有效..我希望有更好的答案和我希望我有更多的声望点,所以我可以回复 user387821,看看他是否有任何额外的提示。

【讨论】:

以上是关于Python telnetlib:令人惊讶的问题的主要内容,如果未能解决你的问题,请参考以下文章

负整数除法令人惊讶的结果

当块数很大时,CUDA GPU的结果令人惊讶

Python3+telnetlib实现telnet客户端

Python 3 telnetlib 路由器重启

python中telnetlib模块的使用

Telnet客户端没有收到。 Python telnetlib作为服务器