2008-10-16 72 views
28

Làm cách nào để có thể nhận danh sách địa chỉ IP hoặc tên máy chủ từ mạng cục bộ dễ dàng bằng Python?Danh sách địa chỉ IP/tên máy chủ từ mạng cục bộ trong Python

Nó sẽ là tốt nhất nếu nó là đa nền tảng, nhưng nó cần phải làm việc trên Mac OS X đầu tiên, sau đó những người khác làm theo.

Edit: By địa phương tôi có nghĩa là tất cả các hoạt động địa chỉ trong một mạng nội bộ, chẳng hạn như 192.168.xxx.xxx.

Vì vậy, nếu địa chỉ IP của máy tính của tôi (trong mạng nội bộ) là 192.168.1.1, và tôi có ba máy vi tính kết nối khác, tôi muốn nó trở về địa chỉ IP 192.168.1.2, 192.168.1.3, 192.168.1.4, và có thể là hostname của họ.

Trả lời

16

Nếu bởi "địa phương" bạn có nghĩa là trên cùng một đoạn mạng, sau đó bạn phải thực hiện các bước sau:

  1. Xác định địa chỉ IP của riêng bạn
  2. Xác định mặt nạ mạng của riêng bạn
  3. Xác định mạng dao động
  4. Quét tất cả các địa chỉ (ngoại trừ mức thấp nhất, đó là địa chỉ mạng của bạn và cao nhất, đó là địa chỉ quảng bá của bạn).
  5. Sử dụng tra cứu ngược lại của DNS của bạn để xác định tên máy chủ cho các địa chỉ IP mà đáp lại quét của bạn.

Hoặc bạn chỉ có thể cho phép Python thực thi nmap bên ngoài và đưa kết quả trở lại chương trình của bạn.

0

Một trong các câu trả lời trong this question có thể giúp bạn. Có vẻ như là một phiên bản nền tảng bất khả tri đối với python, nhưng tôi chưa thử nó.

+0

Không, tôi không muốn địa chỉ IP của mình, tôi muốn tất cả mọi người elses. Những gì Steve Moyer đã nói, nhưng với mã số :) –

7

Nếu bạn biết tên của máy tính của bạn, bạn có thể sử dụng:

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 

Nếu không, bạn sẽ phải quét cho tất cả các địa chỉ IP theo mặt nạ giống như máy tính cục bộ của bạn (IP1), như đã nêu trong một câu trả lời khác.

+0

làm cách nào để lấy tên máy tính của tôi –

+0

socket.gethostname() trả về tên của máy tính – Mapad

17

Cập nhật: Tập lệnh hiện được đặt trên github.

Tôi đã viết small python script, sử dụng số arping() của scapy.

+1

độ dài của bạn không chính xác trong long2ip() và long2net() – newacct

+0

phải được sửa bây giờ –

+0

Cần phải chạy dưới dạng gốc ... –

2

Hãy thử:

import socket 

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

Đây là một công cụ nhỏ scanip rằng sẽ giúp bạn có được tất cả các địa chỉ ip và địa chỉ mac tương ứng của họ trong mạng (Công trình trên Linux). Đây là liên kết cho scanip (Ip và Mac máy quét) viết bằng python. https://pypi.python.org/pypi/scanip/1.0

Bạn cũng có thể tải nó bằng cách sử pips cài đặt scanip trên Linux và sử dụng nó, tạo ra một tập tin thử nghiệm trong python và sử dụng nó như this-

import scanip.scanip 

scanip.scanip.start_scan() 

và chạy chương trình này. Tất cả ip và địa chỉ mac tương ứng của chúng trong mạng LAN sẽ được hiển thị trong terminal.

0

Tôi đã thu thập chức năng sau từ một số chủ đề khác và nó hoạt động với tôi trong 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) 
Các vấn đề liên quan