Python telnetlib:令人惊讶的问题

时间:2010-10-22 21:03:57

标签: python telnet telnetlib

我正在使用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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

这样做非常简单:如果有任何东西要从我们的套接字读取(服务器已经回答),它将返回True,否则它将返回False。

那么,read_very_eager(self)的作用是:检查是否有可供阅读的内容。如果有,则从套接字读取,否则只返回一个空字符串。

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

答案 1 :(得分:3)

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