Answers:
我应该澄清一下,这里的代码适用于Linux(注意注释和有关其他Unices的文章)。OP要求使用Linux解决方案,但是最好将问题更改为“如何获取网络掩码”,并让答案结合更多的Unix风格的最佳方法。
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
与其他传统的网络命令(如netstat,arp,rpr和route)一起,ifconfig是net-tools软件包的一部分。长期以来,Net-tools一直没有得到积极的开发,因此,为了支持较新的iproute2软件包,人们正在努力对其进行弃用。为了简洁起见,如果您想了解有关此基本过渡的更多详细信息,请参见以下相关链接:
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
我想知道您是否真的只想要口罩。也许您真的希望带掩码的网络(或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”。
ip -o -f inet addr show scope global
和ip route list default
。
如果您使用的操作系统以十六进制形式输出遮罩,则可以执行以下操作:
#!/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
,而在现实生活中情况并非如此ifconfig
。但我建议您进行一些更改:ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
。在-o
让grep
行,而不是一大堆(更有效)的唯一回报的一部分。匹配非空格字符([^\s]*
)以找到网络掩码令牌的结尾。为了安全起见,在字段定界符周围使用单引号引起来。
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
以十六进制输出掩码。
如果要查找默认网络设备的网络掩码,则此命令将返回默认设备,因为默认设备可能不是eth0。
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
然后此命令检索掩码:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
多亏了Eliah Kagan和Paulo Tome,他们帮助我简化和阐明了答案。在我的个人计算机上,默认的以太网设备是“ wlx504654c1a91”,它太复杂了,难以记住和准确键入,因此需要两步过程。
grep 'pattern' | awk '{ action }'
通常可以减少到awk '/pattern/ { action }'
ifconfig
netmask行是:inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
,那么虽然可以轻松调整答案,但可能没有一个万能的选择(仅使用Bash / ifconfig) 。