【问题标题】:Availability of IP Address - PythonIP 地址的可用性 - Python
【发布时间】:2011-06-28 19:27:26
【问题描述】:

如何在python中检查IP地址的可用性?

例如,我不想将系统的 IP 地址更改为 192.168.112.226,静态覆盖 dhcp 提供的地址。默认网关是 192.168.112.1。但在分配给自己之前,我不想检查是否有人在使用 192.168.112.226。

通常在 bash 的命令行中执行此操作。我用 ping 192.168.112.226 检查。如果主机无法访问,我使用 'ifconfig' 和 'route' 将其分配给自己。

如何使用 python 自动化?

PS:我更喜欢python,这样无论成功还是失败,我都可以使用python-notify来美化输出。

【问题讨论】:

  • 您需要在网络上安装 DHCP 服务器。
  • 我不想使用 dhcp 进行分配。 DHCP 已经可用。但我想为我的系统分配一个静态 IP,覆盖 DHCP 提供的一个。但在覆盖之前,我想确保它没有分配给网络中的任何其他系统。而且我不想使用ping。应该有某种方式可以以编程方式找到它。
  • 我很好奇是什么原因?
  • 这是不可能的。使用 IP 的机器可能已关闭。 Ping 告诉您使用该地址的机器是否在线,而不是该地址是否已被使用。
  • @Bharat 这是您的 DHCP 客户端配置。为 dhcpcd 在/etc/dhcpcd.conf 中设置hostname

标签: python networking ip-address static-ip-address


【解决方案1】:

这在很多方面都非常糟糕,我什至无法解释这是多么糟糕。

你为什么要这个?能否请您告诉我们,我们可以想出一个比这个完全丑陋的“解决方案”更好的答案吗?

如果你有一个 Linux/Unix 系统,你可以让你的 DHCP 客户端请求 DHCP 服务器给你一个特定的 IP 地址,如果 DHCP 服务器知道它是免费的。如何做到这一点取决于分布。

我发现您将使用“解决方案”创建两个问题。

  • 正如其他人所写,您现在可以检查该 IP 是否“免费”,但拥有该 IP 地址的机器可能会在您的测试后立即启动。使用你绑架的 IP 地址。

  • 如果 DHCP 服务器不知道您已经绑架了一个 IP 地址,它可能会将其泄露给其他人。

无论它会破坏该计算机和您的网络,产生大量工作,并可能激怒网络管理员。而你不希望这样,是吗?

【讨论】:

  • 我完全理解你的观点,但我想他在家里用他的adsl路由器尝试这个只是为了好玩和学习python。我想:)
  • Pitto,尽管这种用法真的很糟糕。
【解决方案2】:

好的,如果你想使用bash,你可以导入os模块或子进程模块。

例如:

import os
command = os.system('pint 192.168.112.226')
if command == 0: #Sucess
    #write os.system() and give it ifconfig and route commands as parameter.
else: print "This IP is used by another person in your network."

您可以阅读更多关于 os.system 和 python 中的子进程的信息,例如通过导入它们并编写 help(subprocess)

【讨论】:

  • 这种方法存在一些问题。一个是给定的 ping 命令永远不会结束。您需要使用 -c 选项 ping -c 1 192.168.112.226 限制 ping 的数量。在 Unix 上,系统命令不只是返回错误级别,而是一个包含状态和原因的打包返回值。你必须像这样解压它:rv = WEXITSTATUS(os.system(cmd)) == 0
  • 部分电脑会禁用ICMP,即不响应ping;某些计算机可能暂时离线。此问题的一般最佳解决方案是 DHCP。
  • @Bharat 您是否尝试询问您的系统管理员是否可以在 DHCP 服务器中为您的主机分配永久 IP?这是可以做到的。
  • @Bharat 但系统管理员可以访问它。此外,这没有多大意义,因为您想要一个永久 IP,但是如果您选择的 IP 已经被占用,您将不得不自己更改它,无论如何。所以它不是永久的。坦率地说,它也是一个糟糕的网络公民。某些系统管理员可能不得不在某个时候花时间跟踪您...
  • @Bharathwaaj,我不鼓励这样做,因为其他发帖人已经说明了原因。但是,在 Linux 上,您可以 ping 主机,然后检查 ARP 以查看表中是否有条目。如果有 ARP 条目,您可以确定其他人正在使用该 IP 地址 - 即使 ping 没有响应。尝试对您感兴趣的 IP 地址执行 ping 命令,然后使用 cat /proc/net/arp | tail --lines=+2 | awk '{ print $1 }' | grep ^192.168.112.226$(当然,在 grep 命令中使用您感兴趣的 IP 地址)。如果它打印出一个 IP 地址,说明它正在使用中。
【解决方案3】:

您可以使用 socket.gethostbyaddr() 来查看 IP 地址是否正在使用中。

import sys, os, socket

# Stores the IP Address
ip_address = sys.argv[1]

try:
    socket.gethostbyaddr(ip_address)
    # If previous line doesn't throw exception, IP address is being used by someone
    print "No"
except socket.herror:
    # socket.gethostbyaddr() throws error, so IP is not being used at present
    # You can write os.system() and give it ifconfig and route commands as parameter.
    print "Yes"

这段代码的问题是,如果网络上没有使用 IP 地址,method.gethostbyaddr() 会花费大量时间来抛出 socket.herror。

如果你把这个脚本命名为isIPAvailable.py,那么它可以被调用:

python isIPAvailable.py 192.168.112.226

【讨论】:

  • 不知道这种做法是否正确。因为我刚刚发现了这个问题。我将给出重现的步骤。首先,dhcp 服务器将 192.168.112.143 分配给我的系统。然后我用 ifconfig 将其覆盖为 192.168.112.226。现在,如果我检查 python isIPAvailable.py 192.168.112.143,它说明不可用。
  • @Bharathwaaj 我刚才做了同样的事情,但它奏效了。用 192.168.112.226 覆盖您的 IP 地址后,您是否 ping 192.168.112.143?
  • 是的。基本上在我重新分配到 192.168.112.226 之后,192.168.112.142 应该是可用的。
猜你喜欢
  • 2021-10-06
  • 2011-05-30
  • 1970-01-01
  • 2016-11-17
  • 2012-08-23
  • 2010-11-22
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多