Python中本地网络的IP地址/主机名列表

时间:2008-10-16 02:32:34

标签: python networking

如何在Python中轻松获取本地网络中的IP地址或主机名列表?

最好是多平台,但它需要首先在Mac OS X上运行,然后其他人跟进。

修改:在本地,我指的是本地网络中的所有有效地址,例如192.168.xxx.xxx

因此,如果我的计算机的IP地址(在本地网络内)是192.168.1.1,并且我有其他三台连接的计算机,我希望它返回IP地址192.168.1.2,{{ 1}},192.168.1.3,可能还有他们的主机名。

10 个答案:

答案 0 :(得分:20)

更新:该脚本现在位于github

我写了一个small python script,它利用了scapyarping()

答案 1 :(得分:18)

如果“本地”是指同一网段,则必须执行以下步骤:

  1. 确定您自己的IP地址
  2. 确定您自己的网络掩码
  3. 确定网络范围
  4. 扫描所有地址(最低的,除了您的网络地址和最高的地址,这是您的广播地址)。
  5. 使用DNS的反向查找来确定响应扫描的IP地址的主机名。
  6. 或者你可以让Python在外部执行nmap并将结果传回你的程序。

答案 2 :(得分:9)

如果您知道可以使用的计算机名称:

import socket
IP1 = socket.gethostbyname(socket.gethostname()) # local IP adress of your computer
IP2 = socket.gethostbyname('name_of_your_computer') # IP adress of remote computer

否则,您必须扫描与本地计算机(IP1)相同掩码的所有IP地址,如另一个答案中所述。

答案 3 :(得分:3)

尝试:

import socket

print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])

答案 4 :(得分:3)

我从其他一些线程中收集了以下功能,它在Ubuntu中适用于我。

import os
import socket    
import multiprocessing
import subprocess
import os


def pinger(job_q, results_q):
    """
    Do Ping
    :param job_q:
    :param results_q:
    :return:
    """
    DEVNULL = open(os.devnull, 'w')
    while True:

        ip = job_q.get()

        if ip is None:
            break

        try:
            subprocess.check_call(['ping', '-c1', ip],
                                  stdout=DEVNULL)
            results_q.put(ip)
        except:
            pass


def get_my_ip():
    """
    Find my IP address
    :return:
    """
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    ip = s.getsockname()[0]
    s.close()
    return ip


def map_network(pool_size=255):
    """
    Maps the network
    :param pool_size: amount of parallel ping processes
    :return: list of valid ip addresses
    """

    ip_list = list()

    # get my IP and compose a base like 192.168.1.xxx
    ip_parts = get_my_ip().split('.')
    base_ip = ip_parts[0] + '.' + ip_parts[1] + '.' + ip_parts[2] + '.'

    # prepare the jobs queue
    jobs = multiprocessing.Queue()
    results = multiprocessing.Queue()

    pool = [multiprocessing.Process(target=pinger, args=(jobs, results)) for i in range(pool_size)]

    for p in pool:
        p.start()

    # cue hte ping processes
    for i in range(1, 255):
        jobs.put(base_ip + '{0}'.format(i))

    for p in pool:
        jobs.put(None)

    for p in pool:
        p.join()

    # collect he results
    while not results.empty():
        ip = results.get()
        ip_list.append(ip)

    return ip_list


if __name__ == '__main__':

    print('Mapping...')
    lst = map_network()
    print(lst)

答案 5 :(得分:0)

this question中的一个答案可能会对您有所帮助。似乎有一个平台不可知版本的python,但我还没有尝试过。

答案 6 :(得分:0)

这是一个小工具 scanip ,它可以帮助您获取网络中的所有IP地址及其相应的mac地址(适用于Linux)。 这是用python编写的 scanip (Ip和Mac扫描程序)的链接。 https://pypi.python.org/pypi/scanip/1.0

你也可以在linux上使用 pip install scanip 下载它并使用它,在python中创建一个测试文件并像这样使用它 -

import scanip.scanip

scanip.scanip.start_scan()

并运行此程序。局域网中的所有IP及其对应的mac地址都将显示在终端中。

答案 7 :(得分:0)

我找到了这个network scanner in python article并写下了这段简短的代码。它满足您的要求!但是,您确实需要知道设备的可访问端口。端口22是ssh标准以及我正在使用的端口。我想您可以遍历所有端口。一些默认值是:

linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
windows: [135, 137, 138, 139, 445]
mac: [22, 445, 548, 631]
import socket

def connect(hostname, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.setdefaulttimeout(1)
    result = sock.connect_ex((hostname, port))
    sock.close()
    return result == 0

for i in range(0,255):
    res = connect("192.168.1."+str(i), 22)
    if res:
        print("Device found at: ", "192.168.1."+str(i) + ":"+str(22))

答案 8 :(得分:0)

我已经完成以下代码来获取MAC已知设备的IP。可以对其进行相应的修改,以通过一些字符串操作获得所有IP。希望对您有帮助。

git checkout develop
git merge proj1/develop
git merge proj2/develop
<make more changes and resolve conflicts>
git commit -a
git push proj2 develop 

答案 9 :(得分:0)

对于OSX(和Linux),一个简单的解决方案是使用os.popen或os.system并运行arp -a命令。

例如:

devices = []
for device in os.popen('arp -a'): devices.append(device)

这将为您提供本地网络上设备的列表。