我正在编写一个 bash 脚本,需要将一些原始网络信息存储在单独的变量中。例如,mac地址和IP地址在单独的变量中,例如
IPADDRESS=$(some_command)
MACADDRESS=$(some_other_command)
echo "$IPADDRESS has mac address $MACADDRESS"
这是一个简化的例子,因为我不是将直接读取此内容,而是将其传递给专有程序作为/bin/proprietary_program $IPADDRESS $MACADDRESS
.
在 Linux 中如何仅获取字符串形式的 MAC 地址和字符串形式的 IP 地址?我更喜欢ip
尽可能使用该命令。
答案1
由于我没有看到任何使用nmcli
(NetworkManager) 的示例,因此我将在此处添加它们:
nmcli -f IP4.ADDRESS device show your_nic (returns all IPv4 addresses)
nmcli -f IP6.ADDRESS device show your_nic (returns all IPv6 addresses)
nmcli -f GENERAL.HWADDR device show your_nic (returns MAC address)
答案2
您可以解析以下输出ip address
:我的输出如下(我添加了额外的 IP 地址以表明它可以完成):
$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp10s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether f0:79:59:dc:c4:bf brd ff:ff:ff:ff:ff:ff
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether f0:79:59:dc:c3:75 brd ff:ff:ff:ff:ff:ff
altname enp0s25
inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet 129.168.1.101/24 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::f279:59ff:fedc:c375/64 scope link noprefixroute
valid_lft forever preferred_lft forever
如果我们使用正则表达式来查找地址,我们最终会得到 IPv4 地址列表。
$ IPV4=$(ip address | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}' )
$ echo $IPV4
127.0.0.1/8 192.168.1.100/24 129.168.1.101/24
$ for i in $IPV4; do echo $i; done
127.0.0.1/8
192.168.1.100/24
129.168.1.101/24
您只需要为 IPv6(如果需要)和 MAC 编写一个正则表达式即可完成。