2008-10-16 171 views
28

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

这将是最好的,如果它是多平台,但它需要首先在Mac OS X上运行,那么其他人跟随。

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

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

回答

16

如果“本地”你的意思是在同一个网段,那么你必须执行以下步骤:

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

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

0

一个在this question问题的答案可以帮助你。似乎有一个Python的平台不可知论版本,但我还没有尝试过。

+0

不,我不想要我的IP地址,我想每个人都有。什么史蒂夫莫耶尔说过,但与代码:) – 2008-10-16 10:08:52

7

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

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地址,如规定另一个答案。

+0

我如何得到我的电脑的名称 – 2015-02-13 21:12:58

+0

socket.gethostname()返回计算机的名称 – Mapad 2015-02-18 18:03:53

2

尝试:

import socket 

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

这里是一个小工具SCANIP,这将有助于你得到的所有IP地址及其对应的MAC地址的网络(在Linux)英寸 这是用python编写的scanip(IP和Mac扫描仪)的链接。 https://pypi.python.org/pypi/scanip/1.0

您也可以使用PIP在Linux上安装SCANIP,并使用它,在Python创建一个测试文件,并使用它像这 -

import scanip.scanip 

scanip.scanip.start_scan() 

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

0

我从其他一些线程收集了以下功能,它在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)