bashnetmask

How to get the netmask of a device in bash using `ip`?


I'm writing a bash function which adds ip routes such as the following:

ip route add table 128 to 192.168.1.0/24 dev eno1

To get the current netmask, I can do ip -f inet -o addr show dev eno1 which will give me a value such as 192.168.1.123/24, but this is not accepted by ip. The unmasked bits need to be zero, e.g. 192.168.1.0/24.

How do I most easily change the unmasked bits of the netmask to zero in bash?


Solution

  • As mentioned in the comments ipcalc or sipcalc will both do it for you.

    e.g.

    $ ipcalc 192.168.0.1/24
    Address:   192.168.0.1          11000000.10101000.00000000. 00000001
    Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
    Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
    =>
    Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
    HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
    HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
    Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
    Hosts/Net: 254                   Class C, Private Internet
    

    or

    $ sipcalc 192.168.0.1/24
    -[ipv4 : 192.168.0.1/24] - 0
    
    [CIDR]
    Host address        - 192.168.0.1
    Host address (decimal)  - 3232235521
    Host address (hex)  - C0A80001
    Network address     - 192.168.0.0
    Network mask        - 255.255.255.0
    Network mask (bits) - 24
    Network mask (hex)  - FFFFFF00
    Broadcast address   - 192.168.0.255
    Cisco wildcard      - 0.0.0.255
    Addresses in network    - 256
    Network range       - 192.168.0.0 - 192.168.0.255
    Usable range        - 192.168.0.1 - 192.168.0.254