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

Jos*_*unt 37 python networking

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

如果它是多平台的,那将是最好的,但它需要首先在Mac OS X上运行,然后其他人遵循.

编辑:本地我指的是本地网络中的所有活动地址,例如192.168.xxx.xxx.

所以,如果我的电脑的IP地址(本地网络内)是192.168.1.1的,我有另外三个连接的计算机,我希望它返回的IP地址192.168.1.2,192.168.1.3,192.168.1.4,可能它们的主机名.

Ben*_*gel 21

更新:脚本现在位于github上.

我写了一个小的python脚本,它利用了scapyarping().


Ste*_*yer 19

如果"本地"表示同一网段,则必须执行以下步骤:

  1. 确定您自己的IP地址
  2. 确定您自己的网络掩码
  3. 确定网络范围
  4. 扫描所有地址(最低的,除了您的网络地址和最高的地址,这是您的广播地址).
  5. 使用DNS的反向查找来确定响应扫描的IP地址的主机名.

或者你可以让Python在外部执行nmap并将结果传回你的程序.


Map*_*pad 10

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

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
Run Code Online (Sandbox Code Playgroud)

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


San*_*era 6

我已经从其他一些线程中收集了以下功能,并且在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)
Run Code Online (Sandbox Code Playgroud)


小智 5

在 python 文章中找到了这个网络扫描仪并编写了这段简短的代码。它做你想做的事!但是,您确实需要知道您的设备的可访问端口。端口 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]
Run Code Online (Sandbox Code Playgroud)
linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
windows: [135, 137, 138, 139, 445]
mac: [22, 445, 548, 631]
Run Code Online (Sandbox Code Playgroud)

TheLizzard编辑:

使用上面的代码并添加线程:

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))
Run Code Online (Sandbox Code Playgroud)

  • @dlammy我知道我有点晚了,但我添加了线程。现在,它可以在不到 3 秒的时间内扫描所有 256 个可能的 IP。 (2认同)

tro*_*zel 5

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

例如:

devices = []
for device in os.popen('arp -a'): devices.append(device)
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎在我的网络上同时接收有线和无线设备@tdelozie (2认同)