Làm thế nào để có được netmask từ bash?


8

Tôi muốn có được netmask của tôi trên Linux. Nó được xuất ra ifconfignhưng tôi muốn trích xuất chuỗi.


5
Câu hỏi này là khó khăn, trên thực tế, nếu bạn không xác định hệ điều hành của bạn, ví dụ như FreeBSD của ifconfigdòng netmask s là: inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255, như vậy trong khi các câu trả lời có thể dễ dàng điều chỉnh, có lẽ không ai-size-fits-tất cả (sử dụng Bash / ifconfig chỉ) .
sr_

Câu trả lời:


8

Tôi nên làm rõ rằng mã ở đây hoạt động cho Linux, (lưu ý nhận xét và đăng về các Thông báo khác). OP đã yêu cầu một giải pháp Linux, nhưng sẽ tốt hơn nếu thay đổi câu hỏi thành "làm thế nào để có được netmask" nói chung và có câu trả lời kết hợp cách tốt nhất để có thêm hương vị Unix.

#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'

./script eth0

Giới thiệu về ifconfig trong Linux

Cùng với các lệnh mạng truyền thống khác như netstat, arp, rarp và route, ifconfig là một phần của gói công cụ mạng . Các công cụ mạng đã không được tích cực phát triển từ rất lâu và có những nỗ lực để loại bỏ nó theo hướng có lợi cho gói iproute2 mới hơn . Vì lợi ích của sự ngắn gọn, nếu bạn muốn biết thêm chi tiết về quá trình chuyển đổi cơ bản này, đây là một số liên kết có liên quan:

Ví dụ điển hình: Debian Linux

Ví dụ điển hình: Arch Linux

Trang man cho ifconfig công cụ mạng (xem phần BUGS)

Phân tích và so sánh các khung từ góc độ người dùng


Nếu giao diện được đề cập không có netmask, giải pháp này trả về '1'. Regex cần một số thao tác nghiêm túc để làm cho nó đáng tin cậy / an toàn bao gồm cả nhu cầu về một mỏ neo thích hợp trên từ rất quan trọng 'Mặt nạ'.
Oliver Dungey

7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?


Bạn đang mất tích | cắt -c6- để xóa "Mặt nạ:"
michelemarcon

3
Chỉ định dấu tách trường awk cũng hoạt động để xóa "Mặt nạ:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

Trong Debian Stretch / net-tools 2.10-alpha tôi đã phải đổi thành cái này:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

Tôi tự hỏi nếu bạn thực sự chỉ muốn mặt nạ. Có thể bạn thực sự muốn mạng (hoặc IP) có mặt nạ, sử dụng trong các tệp cấu hình, với nmaphoặc bất cứ thứ gì.

Trong trường hợp đó, trên Linux, bạn cũng có thể phân tích cú pháp đầu ra của ip ...lệnh.

Để liệt kê tất cả các giao diện với địa chỉ và mặt nạ của chúng trong ký hiệu CIDR:

ip -o -f inet addr show | awk '/scope global/ {print $2, $4}'

Hoặc để hạn chế giao diện mặc định:

default_if=$(ip route list | awk '/^default/ {print $5}')
ip -o -f inet addr show $default_if | awk '{print $4}'

mang lại cho tôi "192.168.1.61/24" trên máy của tôi.


2
... không thực sự cần thiết để khớp với 'phạm vi toàn cầu' hoặc 'mặc định' như bạn có thể làm ip -o -f inet addr show scope globalip route list default.
bryn

3

nếu bạn đang sử dụng một hệ điều hành xuất ra mặt nạ ở dạng hex, bạn có thể làm một cái gì đó như:

#!/usr/bin/bash

# read the mask, and strip leading 0x if it's there
hexmask=$( echo $1 | sed -e 's/^0x//' )

# loop through $hexmask in pairs
#
for (( i=0; i<${#hexmask}; i+=2 )); do
        if (( $i > 1 )); then
                # use a . to separate octets
                # but don't print a leading .
                printf "%s" "."
        fi
        printf "%d" "0x${1:$i:2}"
done

printf "\n"

2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4

Đây là câu trả lời tốt nhất cho đến nay vì phần còn lại dựa vào một số cột cố định sử dụng awkmà không phải là trường hợp thực tế ifconfig. Tôi sẽ đề nghị một vài thay đổi mặc dù : ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. Vì -ovậy, grepchỉ trả về một phần của dòng chứ không phải toàn bộ lô (hiệu quả hơn). Khớp các ký tự không phải khoảng trắng ( [^\s]*) để tìm phần cuối của mã thông báo netmask. Báo giá duy nhất xung quanh dấu phân cách hiện trường cho an toàn.
Oliver Dungey

trên macOS tôi có /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'thể xuất mặt nạ ở dạng hex.
Tomachi

1

Nếu bạn đang tìm kiếm netmask cho thiết bị mạng mặc định, lệnh này sẽ trả về thiết bị mặc định vì thiết bị mặc định có thể không phải là eth0

netdevice=$(ip r | grep default | awk '/default/ {print $5}')

Và lệnh này lấy mặt nạ:

netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')

Cảm ơn Eliah Kagan và Paulo Tome đã giúp tôi vừa đơn giản hóa vừa làm rõ câu trả lời. Trên máy cá nhân của tôi, thiết bị ethernet mặc định là "wlx504654c1a91" quá phức tạp để nhớ và gõ chính xác, do đó là quá trình hai bước.


1
grep 'pattern' | awk '{ action }'thường có thể được giảm xuốngawk '/pattern/ { action }'
roaima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.