¿Cómo asignar la dirección IP a la interfaz en python?

Tengo una secuencia de comandos de Python que establece la dirección IP4 para mis interfaces inalámbricas y cableadas. Hasta ahora, uso el comando de subprocess como:

 subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"]) 

¿Cómo puedo configurar la dirección IP4 de una interfaz utilizando bibliotecas de python? ¿Y si hay alguna manera de obtener una configuración de IP ya existente usando las bibliotecas de python?

Establecer una dirección a través de la interfaz ioctl anterior:

 import socket, struct, fcntl SIOCSIFADDR = 0x8916 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def setIpAddr(iface, ip): bin_ip = socket.inet_aton(ip) ifreq = struct.pack('16sH2s4s8s', iface, socket.AF_INET, '\x00' * 2, bin_ip, '\x00' * 8) fcntl.ioctl(sock, SIOCSIFADDR, ifreq) setIpAddr('em1', '192.168.0.1') 

(la configuración de la máscara de red se realiza con SIOCSIFNETMASK = 0x891C )

Las direcciones IP se pueden recuperar de la misma manera: Cómo encontrar direcciones IP locales usando el stdlib de Python

Creo que hay una implementación Python de Netlink en caso de que quiera usarla sobre ioctl

Con pyroute2 .IPRoute:

 from pyroute2 import IPRoute ip = IPRoute() index = ip.link_lookup(ifname='em1')[0] ip.addr('add', index, address='192.168.0.1', mask=24) ip.close() 

Con pyroute2 .IPDB:

 from pyroute2 import IPDB ip = IPDB() with ip.interfaces.em1 as em1: em1.add_ip('192.168.0.1/24') ip.release() 

Tienes múltiples opciones para hacerlo desde tu progtwig python.

Uno podría usar la herramienta ip como mostraste. Si bien esta no es la mejor opción, en general esto hace el trabajo mientras que es un poco lento y arkward para progtwigr.

Otra forma sería hacer las cosas que hace ip por su cuenta usando la interfaz de kernel netlink directamente. Sé que libnl tiene algunos enlaces experimentales (?) De python. Esto puede funcionar pero tendrás que lidiar con muchas cosas de bajo nivel. No lo recomendaría de esta manera para simples “establecer y obtener” ips pero es la forma más “correcta” y confiable de hacerlo.

La mejor manera en mi opinión (si solo desea configurar y obtener ips) sería utilizar la interfaz dbus de NetworkManagers. Si bien esto es muy limitado y puede tener sus propios problemas (puede que se comporte de la forma que no le gustaría), esta es la forma más directa si el NetworkManager se está ejecutando de todos modos.

Por lo tanto, elija el enfoque libnl si desea ensuciarse las manos, es claramente superior pero también mucho más trabajo. También puede salirse con la interfaz dbus de NetworkManager, según sus necesidades y la configuración general del sistema. De lo contrario, puedes dejarlo así.