If you have multiple network interfaces on your machine, before doing any work on a particular interface, you would like to know the status of that network interface, for example, if the interface is actually up. This makes sure that you route your command to active interfaces.
This recipe is written for a Linux machine. So, this script will not run on a Windows or Mac host. In this recipe, we use nmap
, a famous network scanning tool. You can find more about nmap
from its website http://nmap.org/.
You also need the python-nmap
module to run this recipe. This can be installed by pip
, as follows:
$ pip install python-nmap
We can create a socket object and get the IP address of that interface. Then, we can use any of the scanning techniques to probe the interface status.
Listing 3.6 shows the detect network interface status, as follows:
#!/usr/bin/env python # Python Network Programming Cookbook -- Chapter – 3 # This program is optimized for Python 2.7. # It may run on any other version with/without modifications. import argparse import socket import struct import fcntl import nmap SAMPLE_PORTS = '21-23' def get_interface_status(ifname): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ip_address = socket.inet_ntoa(fcntl.ioctl( sock.fileno(), 0x8915, #SIOCGIFADDR, C socket library sockios.h struct.pack('256s', ifname[:15]) )[20:24]) nm = nmap.PortScanner() nm.scan(ip_address, SAMPLE_PORTS) return nm[ip_address].state() if __name__ == '__main__': parser = argparse.ArgumentParser(description='Python networking utils') parser.add_argument('--ifname', action="store", dest="ifname", required=True) given_args = parser.parse_args() ifname = given_args.ifname print "Interface [%s] is: %s" %(ifname, get_interface_status(ifname))
If you run this script to inquire the status of the eth0
status, it will show something similar to the following output:
$ python 3_6_find_network_interface_status.py --ifname=eth0 Interface [eth0] is: up
The recipe takes the interface's name from the command line and passes it to the get_interface_status()
function. This function finds the IP address of that interface by manipulating a UDP socket object.
This recipe needs the nmap
third-party module. We can install that PyPI using the pip
install command. The nmap
scanning instance, nm
, has been created by calling PortScanner()
. An initial scan to a local IP address gives us the status of the associated network interface.
18.117.11.247