Ricky Robinson
Ricky Robinson

Reputation: 22893

Get network address and network mask in Python

In my Python script I need to retrieve both the IP address of the machine the script is running on and its network address and its network bytes.

As for the IP address, I found the solution in the archive:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com",80))
myAddress = (s.getsockname()[0])
s.close()

But how should I go about finding network address and network bytes? I need to put this information into a filter for tcpdump in the format $NetworkAddress/$NetworkBytes, if that helps at all.

Example:

128.1.2.0/20

I can actually find it under inet when I run ip addr. Any easy way to get this information in Python?

Upvotes: 12

Views: 18807

Answers (3)

that1ethicalhacker
that1ethicalhacker

Reputation: 1

Heyo! Late response, but you could use ipadress to get the network address (assuming you have the network mask and an ip address of a device on the same subnet)

import ipaddress
device_ip = "192.168.1.20"
network_subnet = "255.255.255.0"
network_address = ipaddress.Ipv4Network(f"{device_ip}/{network_subnet}", strict=False)
print(network_address)

Which in my case resulted in this:

192.168.1.0/24

Upvotes: 0

svinota
svinota

Reputation: 849

You can retrieve any ip-related info with pyroute2 module:

from pyroute2 import IPDB
ip = IPDB()
print(ip.interfaces['em1'].ipaddr)
ip.release()

Or as a variant:

from pyroute2 import IPRoute
ip = IPRoute()
info = [{'iface': x['index'],
         'addr': x.get_attr('IFA_ADDRESS'),
         'mask': x['prefixlen']} for x in ip.get_addr()]
ip.close()

Upvotes: 3

Antony Hatchkins
Antony Hatchkins

Reputation: 33974

For Linux try

iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 
                             35099, struct.pack('256s', iface))[20:24])

or http://github.com/rlisagor/pynetlinux

(as suggested here: Retrieving network mask in Python)

For Linux, Windows and MacOS consider http://alastairs-place.net/projects/netifaces/

Update:

If you need cidr (like '128.1.2.0/20'), you can use any of the related libs: http://pypi.python.org/pypi?%3Aaction=search&term=cidr&submit=search

For example netaddr:

>> from netaddr import IPNetwork
>> print str(IPNetwork('1.2.3.4/255.255.255.0').cidr)
1.2.3.0/24

Upvotes: 18

Related Questions