Python cidr vào netmask

Lấy một ví dụ về subnet mask 255 này. 255. 255. 240 mà biểu diễn CIDR là 28. Đây là các phương thức để chuyển đổi sang biểu diễn CIDR mà không cần sử dụng bất kỳ mô-đun nào

  • Chia mặt nạ mạng theo dấu chấm, sao cho mỗi octet nằm trong danh sách
  • Đối với mỗi mục trong danh sách, sử dụng hàm bin để lấy biểu diễn nhị phân của từng octet, nhớ gõ chuyển từng octet từ chuỗi sang int[], bin[] chỉ có thể chấp nhận đối tượng int[]
  • Sau đó dùng hàm str[] để chuyển đổi đối tượng bin để sử dụng phương thức đếm, phương thức đếm dùng để đếm số “1” trong hệ nhị phân
  • Sau đó tính tổng số “1” trong danh sách

netmask = "255.255.255.240"
list_mask = netmask.split["."]

Kết quả sau khi chia như thế này. [‘255’, ‘255’, ‘255’, ‘240’]

processing = list[]
for octet in lst_mask:
    processing.append[str[bin[int[octet]]].count["1"]] 

Kết quả xử lý đối tượng là. [8, 8, 8, 4]

Sau đó tổng hợp các số nguyên trong danh sách

sum[processing]

Kết quả là 28

Toàn bộ mã có thể được đơn giản hóa với khả năng hiểu danh sách như thế này

sum[[str[bin[int[octet]]].count["1"] for octet in netmask.split["."]]]

Quảng cáo

Chia sẻ cái này

  • LinkedIn
  • reddit
  • Twitter
  • Facebook
  • WhatsApp
  • Ứng dụng trò chuyện

Như thế này

Thích Đang tải.

Có liên quan

Thông thường, việc thiết lập giao diện mạng TCP/IP ethernet bao gồm địa chỉ IP, mặt nạ mạng và địa chỉ quảng bá. Thật không may cho bạn là người mới, hai công cụ ifconfig và ip hiển thị thông tin giống nhau [hoặc tương tự] ở một định dạng khác

$ /sbin/ifconfig
eth0 Link encap. Ethernet HWaddr 00. d0. c9. a5. 99. f4
inet addr. 146. 112. 129. 3 Bcast. 146. 112. 159. Mặt nạ 255. 255. 255. 224. 0
inet6 địa chỉ. fe80. 2d0. c9ff. kỳ tích5. Phạm vi 99f4/64. Liên kết
UP ​​CHẠY PHÁT TRUYỀN ĐA MTU MTU. 1500 số liệu. 1
Gói RX. lỗi 14706157. 0 giảm. 0 vượt. 0 khung. 0
gói TX. 11728631 lỗi. 0 giảm. 0 vượt. 0 nhà mạng. 0
va chạm. 0 txqueuen. 100
byte RX. 3127295322 [2. 9 GiB] byte TX. 984587855 [938. 9 MiB]
Bộ nhớ. fd8e0000-fd900000

lo Link encap. Vòng lặp cục bộ
inet addr. 127. 0. 0. 1 mặt nạ. 255. 0. 0. 0
inet6 địa chỉ. . 1/128 Phạm vi. Máy chủ
MTU CHẠY LOOPBACK LÊN. 16436 Số liệu. 1
Gói RX. 890946 lỗi. 0 giảm. 0 vượt. 0 khung. 0
gói TX. 890946 lỗi. 0 giảm. 0 vượt. 0 nhà mạng. 0
va chạm. 0 txqueuen. 0
byte RX. 433573498 [413. 4 MiB] byte TX. 433573498 [413. 4 MiB]

Ở đây, ifconfig nói "addr. 146. 112. 129. 3. Mặt nạ. 255. 255. 224. 0",

$ /sbin/ip addr
1. lo. mtu 16436 trạng thái qdisc noqueue CHƯA BIẾT
link/loopback 00. 00. 00. 00. 00. 00 tỷ 00. 00. 00. 00. 00. 00
inet 127. 0. 0. Máy chủ phạm vi 1/8 lo
inet6. 1/128 máy chủ phạm vi
valid_lft foreverreferred_lft forever
2. eth0. trạng thái mtu 1500 qdisc pfifo_fast LÊN qlen 100
link/ether 00. d0. c9. a5. 99. f4 brd ff. ff. ff. ff. ff. ff
inet 146. 112. 129. 3/19 b 146. 112. 159. 255 phạm vi toàn cầu eth0
inet6 fe80. 2d0. c9ff. kỳ tích5. Liên kết phạm vi 99f4/64
valid_lft foreverreferred_lft forever
3. eth1. mtu 1500 qdisc trạng thái noop XUỐNG qlen 1000
link/ether 00. d0. c9. a5. 99. f5 brd ff. ff. ff. ff. ff. v

trong khi ip addr phun ra "146. 112. 129. 3/19" cho một và cùng một giao diện mạng. Tôi thường gọi đầu ra ở trên là "ký hiệu chấm" và cái sau là "mặt nạ mạng ngắn", được gọi chính thức là "định dạng CIDR" theo hiểu biết của tôi, thực tế là số 1 [0-32] trong mặt nạ mạng nhị phân

Nếu phần mềm của bạn mong đợi một ký hiệu chấm, nhưng tất cả những gì bạn nhận được từ nguồn bạn phân tích là số CIDR ngắn, hãy chuyển đổi nó. Nhưng bằng cách nào?

Một số mã Python để làm bạn hài lòng

Đừng ngạc nhiên, tôi không tìm thấy đoạn mã nhỏ và dễ nắm bắt nào trên Internet, có lẽ bạn cũng vậy. Điều đó hơi lạ, đặc biệt là vì cuối cùng, một giải pháp đơn giản không khó thực hiện. Đây là cách tiếp cận của tôi bằng Python

# CIDR to Netmask conversion
# [c] 2010 Peter Bittner, //linux.bittner.it/blog
# 
# Tip for an excellent background read: "IP subnetting made easy"
# //articles.techrepublic.com.com/5100-10878_11-6089187.html

def len2mask[len]:
    """Convert a bit length to a dotted netmask [aka. CIDR to netmask]"""
    mask = ''
    if not isinstance[len, int] or len < 0 or len > 32:
        print "Illegal subnet length: %s [which is a %s]" % [str[len], type[len].__name__]
        return None
    
    for t in range[4]:
        if len > 7:
            mask += '255.'
        else:
            dec = 255 - [2**[8 - len] - 1]
            mask += str[dec] + '.'
        len -= 8
        if len < 0:
            len = 0
    
    return mask[:-1]

# Example
for len in range[32,-1,-1]:
    print '/%d = %s' % [len, len2mask[len]]

Ý tưởng chính là. Mặt nạ mạng nhị phân chứa tất cả các bit 1 ở bên trái và tất cả các bit 0 ở bên phải - không trộn lẫn - và số CIDR đếm các bit 1 đó. Vì vậy, từ trái sang phải,.
  • Miễn là chúng ta có thể trừ 8 bit, chúng ta có một byte đầy những bit, tương ứng với '255' ở dạng thập phân. Dấu chấm [dừng hoàn toàn]
  • Ngay sau khi chúng tôi chạm 0, tất cả các phần khác ở định dạng chấm sẽ là '0'
  • Phần khó xảy ra khi mặt nạ mạng CIDR không phải là bội số của 8, khi đó chúng ta phải tính lũy thừa của phần còn lại [= số CIDR modulo 8] với cơ số 2 - NHƯNG. các bit 1 trong chuỗi nhị phân ở phía sai ở đây, hãy cẩn thận. Đó là cách chúng tôi đến. 255 - [2^[8 - dư] - 1]

Tất nhiên, bạn có thể triển khai thuật toán đơn giản này bằng bất kỳ ngôn ngữ nào khác mà bạn thích. Tất cả một mình, tự nhiên

Lưu ý bên lề
Lưu ý trong đầu ra mẫu ở trên của ifconfig và ip rằng ip liệt kê một giao diện mạng bổ sung so với ifconfig. Cả hai lệnh đã được thực thi trên một và cùng một máy, trực tiếp lần lượt.

Lý do cho điều này có thể là một trong những lý do khiến bạn có thể bắt đầu coi ip là công cụ thay vì ipconfig cho một số tác vụ, như tôi đã làm. ip cũng liệt kê các giao diện không hoạt động hoặc không được định cấu hình. Ví dụ, với liên kết ip -o, bạn có thể lấy địa chỉ MAC của tất cả các giao diện có sẵn [ở định dạng một dòng thuận tiện cho việc xử lý hậu kỳ], bất kể chúng đã được cấu hình hay chưa

Chủ Đề