【问题标题】:Name or service not known名称或服务未知
【发布时间】:2016-11-10 07:10:17
【问题描述】:

我一直在尝试使用以下代码获取登录机器的人的 IP 地址,但出现错误。

>>> import socket
>>> socket.gethostbyname_ex(socket.gethostname())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known

相同的代码可以在其他 linux 机器上运行。 不确定我是否修复它。

【问题讨论】:

  • 在 Arch 64 位内核 4.6.2 上工作
  • 如果你只做socket.gethostname()会发生什么?
  • 我正确获取了实例名称。
  • socket.gethostname() 的输出是否与在 Bash 上运行 echo $HOSTNAME 相同?另外,您可以发布您的/etc/hosts 文件吗?
  • docs.python.org/2/library/socket.html#socket.gethostname - 这是您本地服务器的主机名,与登录机器的人无关。并且文档警告说,如果没有主机到 IP 的映射,您不能在结果上gethostbyname。简而言之,您的服务器配置错误,您的代码没有按照您的意愿行事。

标签: python centos centos6


【解决方案1】:

检查socket.gethostname() 返回的内容,看看是否可以 ping 通。基本上这是查找失败。检查您的/etc/hosts 以查看它是否已列出。我知道这看起来很奇怪,但我认为如果返回的主机名没有条目,你会得到一个名称服务失败,就是这样。

【讨论】:

    【解决方案2】:

    由于没有正确设置主机名而发生错误。在三个不同的地方设置主机名,分别在 -

    1. /etc/主机名
    2. /etc/hosts
    3. 运行命令$主机名

    然后注销并再次登录。你已经完成了。

    【讨论】:

      【解决方案3】:

      如果您使用 IPv6 或具有多个网络接口的服务器,此命令将无法正常工作。

      相反,您可以使用此命令尝试在 8.8.8.8 的端口 53 连接到 Google DNS 服务器,并返回您的 ip:

      import socket
      print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])
      

      【讨论】:

        猜你喜欢
        • 2013-08-08
        • 2016-01-06
        • 2019-07-07
        • 1970-01-01
        • 2021-08-19
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多