【问题标题】:Add localhost's IP and MAC address to shell scripts将 localhost 的 IP 和 MAC 地址添加到 shell 脚本
【发布时间】:2014-08-28 17:56:34
【问题描述】:

我使用以下命令来获取 arp 表。我现在想将 localhost 的 ip 和 MAC 地址添加到输出中。 shell脚本应该怎么写?

arp | grep -v 'incomplete' | tail -n+2 | awk '{print $1"*"$4}'

所以结果如下所示(它将iface和主机ip添加到arp表条目的每一行)

 eno16777736 192.168.140.133 192.168.140.254,00:50:56:ef:2d:57
 eno16777736 192.168.140.133 192.168.140.2,00:50:56:ea:cf:bf

【问题讨论】:

  • 您打算如何处理多个 NIC?此外,ip addr show 通常是一个不错的方法。

标签: shell networking awk grep arp


【解决方案1】:

在我的系统上,我可以:

arp | 
awk 'NR>1{mac[$NF]=mac[$NF]" "$3} END {for (iface in mac) print iface, mac[iface]}' | 
while read iface mac; do
    inet=$(
        ifconfig "$iface" |
        awk -v i=$iface '{for (j=1; j<NF; j++) if ($j == "inet") {print $(j+1); exit}}'
    )
    echo $iface $inet ${mac// /,}
done

【讨论】:

  • 但是如果你使用shell脚本,arp会“找不到”
  • 所以使用完整路径,例如/usr/sbin/arp,或者使用PATH=$PATH:/usr/sbin
  • 感谢 Glenn。它非常接近我的需要。我更新了问题以使预期结果看起来像。
  • 你能告诉我一些如何修改 shell 脚本以获得预期结果吗?谢谢!
  • 从逐段分解我的脚本开始,这样你就可以看到每一位的作用。然后自己试一试。回来提出具体问题。
【解决方案2】:

获取本地接口的 MAC 和 IP 地址信息的最简单方法是“ifconfig”命令,通常位于“/sbin/ifconfig”。 就我而言,我使用 wlan0 作为我的主要接口:

# /sbin/ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 86:75:30:9a:09:87
          inet addr:10.20.30.40  Bcast:10.20.30.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1276663 errors:0 dropped:0 overruns:0 frame:0
          TX packets:820927 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1233280913 (1.2 GB)  TX bytes:105410513 (105.4 MB)

获得所需输出的最简单示例使用组合 echo/grep/sed/awk:

echo $(/sbin/ifconfig wlan0 | \
grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | \
sed 's/^\(HWaddr \|inet addr\:\)//') | \
awk '{print $2"*"$1}'

简介:

在 grep 中使用“-o”选项将仅输出行内匹配的内容,而不是行本身。

'-E' 告诉 grep 在匹配条件中期待“扩展正则表达式”。在这种情况下,我们正在寻找以“HWaddr”或“inet addr:”开头的条目,后跟字符“0-9”、“a-z”、“A-Z”、“:”或'.'。

如果在此处结束命令,则会留下两行,类似于“HWaddr 86:75:30:9a:09:87”和“inet addr:10.20.30.40”。

我们只需要 MAC 和 IP 地址,所以我们告诉 sed 从行首去掉“HWaddr”和“inet addr:”('^' 表示开头)。

通过将该命令的输出包装在 '$()' 中来捕获输出,这会将两行合并为一行,并用空格分隔。将此添加到 'echo' 命令允许我们使用 awk 将空格替换为 '*',使最终输出类似于原始的 'arp | awk' 命令可以。

剩下的就是这个:

# echo $(/sbin/ifconfig wlan0 | grep -oE "(HWaddr\ |inet\ addr:)[0-9a-fA-F:\.]+" | sed 's/^\(HWaddr \|inet addr\:\)//') | awk '{print $2"*"$1}'
10.20.30.40*86:75:30:9a:09:87

您也可以使用其嵌入式正则表达式引擎在纯 Bash 脚本中执行此操作:

# IFS=$'\n' echo $(IFS=$'\n';
for LINE in $(ifconfig wlan0);
do if [[ "${LINE}" =~ .*(HWaddr\ |inet\ addr:)([0-9a-fA-F\:\.]+) || "${LINE}" =~ .*inet\ addr:([\d\.]+) ]];
then echo ${BASH_REMATCH[2]};
fi; done) | \
awk '{print $2"*"$1}'
172.16.17.40*a0:88:b4:78:65:04

...但是解释起来更痛苦:-P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多