【问题标题】:Python socket works as a telnet connection and requires double readPython socket 用作 telnet 连接,需要双重读取
【发布时间】:2014-04-12 07:15:16
【问题描述】:

我正在使用 telnet 连接到设备。连接后,我需要输入用户名admin,按回车\n 并使用空白密码(再次输入\n)。在描述的登录过程之后,我应该会收到(prompt) # 的邀请。每次写入后我都从套接字读取。程序如下:

import socket

s = socket.socket()
#Connecting using telnet
s.connect(('192.168.1.2',23))
a = s.recv(1000)
print 'a:', a
s.send('admin\n\n')
b = s.recv(1000)
print 'b:', b
c = s.recv(1000)
print 'c:', c

程序的输出如下:

a: ��
b: �������� ��!��"��'����#��User:
c: admin

Password:
(prompt) #

问题:

为什么我需要双读才能接收所有信息(print bprint c)而不是单读(print b)?

【问题讨论】:

  • recv() 接收最多指定的字节数。您需要在 while 循环中读取,直到收到所需的字节。
  • print bprint c 不是双重阅读。它正在写入标准输出。要接收不同的线路,请尝试在 recv 调用之间使用 sleep 调用。
  • 我之所以这么称呼它是因为它们代表了我通过b = s.recv(1000)c = s.recv(1000) 获得的信息
  • 你的socket是阻塞的还是非阻塞的?
  • 我相信它在 Python 中默认是阻塞的,不是吗?

标签: python sockets telnet


【解决方案1】:

您可以使用telnetlib,而不是使用原始套接字。

典型用法:

import getpass
import sys
import telnetlib

HOST = "localhost"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()

这将询问您的用户名和密码,然后使用输入的信息向服务器进行身份验证,如下所示:

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

您可以阅读telnetlib documentation for python 2.x here

【讨论】:

  • 另外,如果您使用的是 Python 3.x,则代码非常相似。在此处查看 telnetlib 的 Python 3.x 文档:docs.python.org/3/library/telnetlib.html
  • telnetlib没问题,只是想了解为什么socket不能按预期工作
  • @Konstantin 喝了几杯咖啡后,我将设置一个 telnet 服务器来测试您的代码,然后我会回复您。
  • @StianOK - 发现美国开发者:)
  • @MartinJames 我完全忘记了这一点......但是,我相信你必须使用回车和换行符(\r\n)。这在不同的协议中很常见。
猜你喜欢
  • 2015-09-30
  • 2017-09-02
  • 2011-12-07
  • 2015-06-04
  • 2011-05-30
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多