如何从bash获取网络掩码?


8

我想在Linux上获得我的网络掩码。它与输出,ifconfig但我想提取字符串。


5
这个问题很难,实际上,如果您不指定操作系统,例如FreeBSD的ifconfignetmask行是:inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255,那么虽然可以轻松调整答案,但可能没有一个万能的选择(仅使用Bash / ifconfig) 。
sr_

Answers:


8

我应该澄清一下,这里的代码适用于Linux(注意注释和有关其他Unices的文章)。OP要求使用Linux解决方案,但是最好将问题更改为“如何获取网络掩码”,并让答案结合更多的Unix风格的最佳方法。

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

./script eth0

关于Linux中的ifconfig

与其他传统的网络命令(如netstat,arp,rpr和route)一起,ifconfig是net-tools软件包的一部分。长期以来,Net-tools一直没有得到积极的开发,因此,为了支持较新的iproute2软件包,人们正在努力对其进行弃用。为了简洁起见,如果您想了解有关此基本过渡的更多详细信息,请参见以下相关链接:

案例:Debian Linux

案例:Arch Linux

网络工具ifconfig的手册页(请参阅“错误”部分)

从用户角度分析和比较框架


如果所讨论的接口没有网络掩码,则此解决方案将返回“ 1”。正则表达式需要进行认真的修改才能使其可靠/安全,包括需要在非常重要的“ Mask”这个词上适当定位。
奥利弗·邓吉

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


您不见了| 剪切-c6-以便也删除“掩码:”
michelemarcon

3
指定awk字段分隔符也可以删除“掩码:”:/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

在Debian Stretch / net-tools 2.10-alpha中,我必须更改为:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

我想知道您是否真的只想要口罩。也许您真的希望带掩码的网络(或IP)在配置文件中使用nmap或等等。

在这种情况下,在Linux上,您也可以解析ip ...命令的输出。

要以CIDR格式列出所有接口及其地址和掩码:

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

或将其限制为默认界面:

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

这在我的机器上显示“ 192.168.1.61/24”。


2
......这是不是真的有必要,以匹配“全球范围”或“默认”不管是你可以做的ip -o -f inet addr show scope globalip route list default
bryn

3

如果您使用的操作系统以十六进制形式输出遮罩,则可以执行以下操作:

#!/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

到目前为止,这是最好的答案,因为其余的依赖于固定数量的列awk,而在现实生活中情况并非如此ifconfig。但我建议您进行一些更改:ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2。在-ogrep行,而不是一大堆(更有效)的唯一回报的一部分。匹配非空格字符([^\s]*)以找到网络掩码令牌的结尾。为了安全起见,在字段定界符周围使用单引号引起来。
奥利弗·登基

在macOS上,我/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'以十六进制输出掩码。
Tomachi

1

如果要查找默认网络设备的网络掩码,则此命令将返回默认设备,因为默认设备可能不是eth0。

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

然后此命令检索掩码:

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

多亏了Eliah Kagan和Paulo Tome,他们帮助我简化和阐明了答案。在我的个人计算机上,默认的以太网设备是“ wlx504654c1a91”,它太复杂了,难以记住和准确键入,因此需要两步过程。


1
grep 'pattern' | awk '{ action }'通常可以减少到awk '/pattern/ { action }'
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.