Tôi muốn có được netmask của tôi trên Linux. Nó được xuất ra ifconfig
nhưng tôi muốn trích xuất chuỗi.
Tôi muốn có được netmask của tôi trên Linux. Nó được xuất ra ifconfig
nhưng tôi muốn trích xuất chuỗi.
Câu trả lời:
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
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:
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
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 nmap
hoặ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.
ip -o -f inet addr show scope global
và ip route list default
.
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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
mà 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ì -o
vậy, grep
chỉ 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.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
thể xuất mặt nạ ở dạng hex.
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.
grep 'pattern' | awk '{ action }'
thường có thể được giảm xuốngawk '/pattern/ { action }'
ifconfig
dò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ỉ) .