linux - sacar - Obtener la dirección MAC usando shell script
saber la dirección mac de mi pc (9)
Actualmente todas las soluciones mencionadas para obtener la dirección MAC siempre usan eth0. Pero qué pasa si en lugar de eth0 mis interfaces comienzan con eth1. También en OS X los nombres de interfaz son diferentes.
También la interfaz eth0 puede estar presente pero no se utiliza. Es decir, no está activo, no tiene una IP.
Entonces, ¿hay alguna manera de obtener la dirección MAC para la primera interfaz disponible que sea Activa (es decir, tiene una dirección de entrada, incluso no quiero una que tenga inet6)?
Por ejemplo
eth0 Link encap:Ethernet HWaddr <some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
eth1 Link encap:Ethernet HWaddr <some addr>
inet addr:<some addr> Bcast:<some addr> Mask:<some addr>
inet6 addr: <some addr> Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:123 Metric:123
RX packets:123 errors:123 dropped:123 overruns:123 frame:123
TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
collisions:123 txqueuelen:123
RX bytes:123 (123 MB) TX bytes:123 (123 KB)
Interrupt:123 Memory:00000000-00000000
NOTA: He cambiado los valores de la salida.
Así que en este caso quiero el HWaddr para eth1 y no eth0. ¿Cómo lo encuentro? También debería funcionar en todos los sabores de Linux.
Aquí hay una respuesta alternativa en caso de que las que se enumeran arriba no funcionen para usted. También puede utilizar las siguientes soluciones, que se encontraron here :
ip addr
O
ip addr show
O
ip link
Los tres de estos mostrarán su (s) dirección (es) de MAC junto al link/ether
. Me tropecé con esto porque acababa de hacer una nueva instalación de Debian 9.5 desde una memoria USB sin acceso a Internet, así que solo pude hacer una instalación mínima y recibí
-bash: ifconfig: command not found
cuando probé algunas de las soluciones anteriores. Pensé que alguien más podría encontrar este problema también. Espero eso ayude.
En un sistema GNU / Linux moderno, puede ver las interfaces de red disponibles que muestran el contenido de /sys/class/net/
, por ejemplo:
$ ls /sys/class/net/
enp0s25 lo virbr0 virbr0-nic wlp2s0
Puede verificar si una interfaz está mirando hacia la operstate
en el directorio del dispositivo. Por ejemplo, aquí está cómo puede ver si enp0s25
está activo:
$ cat /sys/class/net/enp0s25/operstate
up
A continuación, puede obtener la dirección MAC de esa interfaz con:
$ cat /sys/class/net/enp0s25/address
ff:00:ff:e9:84:a5
Por ejemplo , aquí hay un simple script de bash que imprime direcciones MAC para interfaces activas:
#!/bin/bash
# getmacifup.sh: Print active NICs MAC addresses
D=''/sys/class/net''
for nic in $( ls $D )
do
echo $nic
if grep -q up $D/$nic/operstate
then
echo -n '' ''
cat $D/$nic/address
fi
done
Y aquí está su salida en un sistema con una interfaz ethernet y wifi:
$ ./getmacifup.sh
enp0s25
ff:00:ff:e9:84:a5
lo
wlp2s0
Para más detalles vea la documentación del Kernel.
Recuerde también que a partir de 2015, la mayoría de las distribuciones de GNU / Linux cambiaron a systemd
, y ya no usan el esquema de nombres de interfaz ethX
; ahora usan una convención de nombres más robusta basada en la topología de hardware, consulte:
La mejor solución específica para Linux es usar sysfs:
$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56
Este método es extremadamente limpio en comparación con los otros y no genera procesos adicionales, ya que read
es un comando incorporado para shells POSIX, incluidos shells que no son BASH. Sin embargo, si necesita portabilidad a OS X, entonces tendrá que usar los métodos ifconfig
y sed
, ya que OS X no tiene una interfaz de sistema de archivos virtual como sysfs.
Observe que el nombre de la interfaz y la dirección MAC son los primeros y últimos campos en una línea sin espacios en blanco iniciales.
Si una de las líneas con sangría contiene inet addr:
el último nombre de la interfaz y la dirección MAC deben imprimirse.
ifconfig -a |
awk ''/^[a-z]/ { iface=$1; mac=$NF; next }
/inet addr:/ { print iface, mac }''
Tenga en cuenta que múltiples interfaces podrían cumplir sus criterios. Luego, el script imprimirá múltiples líneas. (Puede agregar ; exit
justo antes de la llave de cierre final si siempre desea imprimir la primera coincidencia).
Obtener dirección MAC para eth0:
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
Ejemplo:
[me@machine ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
55:b5:00:10:be:10
Oh, si solo quieres la dirección mac mac ether, puedes usar eso:
ifconfig | grep "ether*" | tr -d '' '' | tr -d ''/t'' | cut -c 6-42
(trabajo en macintosh)
-
ifconfig
- obtener toda la información -
grep
- mantén la línea con la dirección -
tr
- limpiar todo -
cut
- remueve el "éter" para tener solo la dirección
Puedes hacer lo siguiente
ifconfig <Interface ex:eth0,eth1> | grep -o -E ''([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}''
También puede obtener MAC para todas las interfaces de la siguiente manera
cat /sys/class/net/*/address
Para interfaz particular como para eth0
cat /sys/class/net/eth0/address
Simplemente ejecute:
ifconfig | grep ether | cut -d " " -f10
O
ip a | grep ether | cut -d " " -f6
Estos dos comandos de ejemplo grep todas las líneas con la cadena "ether" y cortarán la dirección mac (que necesitamos) siguiendo los espacios numéricos (especificados en la opción -f) de la parte grepped.
Probado en diferentes sabores de Linux
$ ip route show default | awk ''/default/ {print $5}''
retorno: eth0 (mi interfaz en línea)
$ cat /sys/class/net/$(ip route show default | awk ''/default/ {print $5}'')/address
return: ec: a8: 6b: bd: 55: 05 (macaddress of eth0, mi interfaz en línea)