Home Linux Cambiar la MAC en Python

Cambiar la MAC en Python

by José Luis Sánchez Borque

En este artículo os muestro como cambiar la MAC de un servidor Ubuntu 22.04 con un pequeño programa de Python. El programa es fácilmente adaptable a otras distribuciones y versiones de Linux y Ubuntu.

Es importante destacar que he optado por utilizar los nuevos comandos de Netplan, dejando atrás los comandos propios de netools. Es decir, el ifconfig de toda la vida….

Empezaré por mostraros la versión de Python que estoy utilizando:

└─# python -V 
Python 3.9.10

He desarrollado el código con Visual Studio Code.

Aquí os pongo el código del programa  cmac.py :

import subprocess
import optparse

def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", dest="interface", help="Espedificar interface de red: -i eth0")
    parser.add_option("-m", "--mac", dest="new_mac", help="Para espedificar nueva MAC: -m 34:56:78:ad:4e:2b")
    (options, arguments) = parser.parse_args()
    if not options.interface:
        parser.error("[-] Please specify and interface, use --help for more info")
    elif not options.new_mac:
        parser.error("[-] Please specify and new MAC address, use --help for more info")
    return options

def change_mac(interface, new_mac):
    print("[+] Changing MAC address for " + interface + " to " + new_mac)
    subprocess.call(["ip", "link", "set", interface, "down"])
    subprocess.call(["ip", "link", "set", "dev", interface, "address", new_mac])
    subprocess.call(["ip", "link", "set", interface, "up"])

def get_mac_address(interface):
    f = open("/sys/class/net/" + options.interface + "/address", "r")
    mac_address = f.read(17)
    f.close
    return mac_address

options = get_arguments()
mac_initial =  get_mac_address(options.interface)
change_mac(options.interface, options.new_mac)
mac_final = get_mac_address(options.interface)
if mac_initial == mac_final:
   print("[-] MAC " + mac_initial + " has NOT changed to " + mac_final)
else:
   print("[+] MAC " + mac_initial + " has changed to " + mac_final)

Ejemplos de uso:

└─# python ./cmac.py --help

Usage: cmac.py [options]

Options:
-h, --help show this help message and exit
-i INTERFACE, --interface=INTERFACE
Espedificar interface de red: -i eth0
-m NEW_MAC, --mac=NEW_MAC
Para espedificar nueva MAC: -m 34:56:78:ad:4e:2b

Veamos como cambiar la MAC de forma provisiona claro, al reiniciar vuelve a su valor original. Veamos en primer lugar la MAC actual:

└─# ip address show dev eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7f:05:7d brd ff:ff:ff:ff:ff:ff
inet 192.168.153.142/24 brd 192.168.153.255 scope global dynamic noprefixroute eth0
valid_lft 1040sec preferred_lft 1040sec

Vamos a establecer un nuevo a valor a 00:0c:29:7f:05:06

└─# python ./cmac.py -i eth0 -m 00:0c:29:7f:05:06
[+] Changing MAC address for eth0 to 00:0c:29:7f:05:06
[+] MAC 00:0c:29:7f:05:7d has changed to 00:0c:29:7f:05:06
Vemos que el cambio ha surgido efecto 😉
─$ ip address show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7f:05:06 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:7f:05:7d
inet 192.168.153.143/24 brd 192.168.153.255 scope global dynamic noprefixroute eth0
valid_lft 1750sec preferred_lft 1750sec
Si no especificamos alguno de los dos parámetros, -i o -m, el programa nos marca el error:
─# python ./cmac.py -i eth0 
Usage: cmac.py [options]

cmac.py: error: [-] Please specify and new MAC address, use --help for more info

Espero os haya gustado…

 

 

You may also like

Leave a Comment