主机名的 Python 套接字替换变量

标签 python sockets

我尝试了各种方法将主机名的变量替换为 socket.connect 调用,但我无法让它工作。我正在进行替换 b/c 我想从文件中读取主机 IP 列表并连接到每个主机 IP。我已将变量正确格式化为带有单引号的字符串,但它不会连接:

# Connect to the Servers LOOP
    with open(sys.argv[2], 'r') as f1:
        for server in f1:
            s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            server = server.strip('\n')
            server = "'%s'" % server
            print 'Connecting to ' + server

            #connect=s.connect(('10.11.1.229',25))
            connect=s.connect((server,25))

            # Receive the banner
            banner=s.recv(1024)
            print banner

            s.close

如果我对主机名进行硬编码,它就可以正常工作。执行结果为:

Connecting to '10.11.1.8'
Traceback (most recent call last):
  File "./connect-loop.py", line 19, in <module>
     connect=s.connect((server,25))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
     return getattr(self._sock,name)(*args)
socket.gaierror: [Errno -2] Name or service not known

感谢任何帮助...

最佳答案

问题是您在服务器名称中添加了勾号(我猜,是为了在打印时正确格式化它),然后在解析主机名时对其进行解释。

尝试:

with open(sys.argv[2], 'r') as f1:
    for server in f1:
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        server = server.strip('\n')
        print 'Connecting to {} ...'.format(repr(server))

        connect=s.connect((server,25))

        banner=s.recv(1024)
        print repr(banner)

        s.close()

变化:

  • 直接在 print 行中设置主机名格式,并使用 repr 引用它。
  • 删除不需要的主机名格式行
  • close() 末尾添加缺少的括号。

关于repr的注意事项:它返回给定值的“人类表示”,对于字符串值来说,它与引用的字符串相同。

关于主机名的 Python 套接字替换变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695582/

相关文章:

python - Django 的性能问题

python - 如何在 Gtk+ 3 中向 GtkBox 添加 css 样式

c - 段错误: 11 received in socket programming

Java,当在 ObjectOutputStream 上调用 readObject() 时,它仅返回一个值

python - 如何使用 Django-mama-CAS 限制每个用户对各种服务的访问?

python - 当给定 IP 和子网掩码时确定网络 IP

python - Python2.7 中是否有返回生成器而不是列表的 range(..) 函数?

Node.JS Socket.IO SSL CORS 错误

c - receive() read() 和 send() 无需等待

java - 使用线程 java 阻塞输出直到输入完成