Passa ai contenuti principali

Alcuni script linux bash per la gestione IPv4


Si propongono di seguito degli script linux bash  per la gestione di IPv4


ip_addr_check: restituisce 0 solo se il parametro di input è un indirizzi IPv4
netmask_check: restituisce 0 solo se il parametro di input è una maschera di rete IPv4
cidr_2_netmask: converte la rappresentazione di una mashera di rete IPv4 da Classless-Inter-Domain-Routing a Decimal-Dotted
netmask_2_cidr: converte la rappresentazione di una mashera di rete IPv4 da Decimal-Dotted a Classless-Inter-Domain-Routing
dec_2_bin: converte la rappresentazione di un intero positivo da decimale a binario
bin_2_dec: converte la rappresentazione di un intero positivo da binario a decimale
ip_addr-dec_2_bin: converte la rappresentazione di un indirizzo Ipv4 da Decimal-Dotted a binario
ip_addr-bin_2_dec: converte la rappresentazione di un indirizzo Ipv4 da binario a Decimal-Dotted a
network_calc: dati un indirizzo IPv4 e relativa netmask, calcola l'indirizzo della rete, il primo e l'ultimo indirizzo della rete, l'indirizzo di broadcast
network_scan: restituisce lo stato CONNECTED / NOT_CONNECTED di ciascun indirizzo IPv4 nel range specificato
if_config: configura l'interfaccia di rete indicata con specifici indirizzo IPv4, netmask e default gateway
set_dns: imposta gli indirizzi dei Domain Name Server
set_proxy: imposta le variabili d'ambiente per server proxy


Questo il codice:



$cat ip_addr_check

#!/bin/bash

#
# Description: it returns 0 exit status if the input string is a valid IP address, 1 otherwise
#
# Usage: ip_addr_check  
#
# Example: read -p "Please, insert an IP address: " IPv4 
#        while ! ./ip_addr_check $IPv4 
#  do 
#   read -p "Bad input. Please, insert a valid IP address: " IPv4
#  done
#
# Author: VDA
#
# Last update: 2019.05.20
#

[ $# -ne 1 ] && { echo "Usage: $0 ip_address"; exit 1; }

if [[ $1 =~ ^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then
        exit 0
else
        exit 1
fi


$ cat netmask_check

#!/bin/bash

#
# Description: it returns 0 exit status if the input string is a netmask (also in Classless-Inter-Domain-Routing notation), 1 otherwise
#
# Usage: netmask_check 
#
# Example: read -p "Please insert an IP: " IPv4
#  .netmask_check $IPv4 && echo "$IPv4 is a network mask" || echo "Not a valid network mask"
#
# Author: VDA
#
# Last update: 2019.05.20
#

[ $# -ne 1 ] && { echo "Usage: $0 {decimal_dotted_notation | cidr_notation}_netmask"; exit 1; }

if [[ $1 =~ ^\/([1-9]{1}|1[0-9]{1}|2[0-9]{1}|30)$ ]]; then
        exit 0 
fi 

if [[ $1 =~  ^((128.0.0.0){1}|(192.0.0.0){1}|(224.0.0.0){1}|(240.0.0.0){1}|(248.0.0.0){1}|(252.0.0.0){1}|(254.0.0.0){1}|(255.0.0.0){1}|(255.128.0.0){1}|(255.192.0.0){1}|(255.224.0.0){1}|(255.240.0.0){1}|(255.248.0.0){1}|(255.252.0.0){1}|(255.254.0.0){1}|(255.255.0.0){1}|(255.255.128.0){1}|(255.255.192.0){1}|(255.255.224.0){1}|(255.255.240.0){1}|(255.255.248.0){1}|(255.255.252.0){1}|(255.255.254.0){1}|(255.255.255.0){1}|(255.255.255.128){1}|(255.255.255.192){1}|(255.255.255.224){1}|(255.255.255.240){1}|(255.255.255.248){1}|(255.255.255.252){1})$ ]]; then
        exit 0 
fi 

exit 1


$ cat cidr_2_netmask

#!/bin/bash

#
# Description: it converts netmasks from Decimal-Dotted to Classless-Inter-Domain-Routing notation
#
# Usage: cidr_2_netmask
#
# Example: CIDR=$(./cidr_2_netmask /24)
#  
# Author: VDA
#
# Last update: 2019.05.20
#

[ $# -ne 1 ] && { echo "Usage: $0 CIDR_notation_netmask"; exit 1; }

[ $1 == "/1" ] && { echo "128.0.0.0"; exit 0; } 
[ $1 == "/2" ] && { echo "192.0.0.0"; exit 0; }
[ $1 == "/3" ] && { echo "224.0.0.0"; exit 0; } 
[ $1 == "/4" ] && { echo "240.0.0.0"; exit 0; } 
[ $1 == "/5" ] && { echo "248.0.0.0"; exit 0; } 
[ $1 == "/6" ] && { echo "252.0.0.0"; exit 0; } 
[ $1 == "/7" ] && { echo "254.0.0.0"; exit 0; } 
[ $1 == "/8" ] && { echo "255.0.0.0"; exit 0; } 
[ $1 == "/9" ] && { echo "255.128.0.0"; exit 0; } 
[ $1 == "/10" ] && { echo "255.192.0.0"; exit 0; } 
[ $1 == "/11" ] && { echo "255.224.0.0"; exit 0; } 
[ $1 == "/12" ] && { echo "255.240.0.0"; exit 0; } 
[ $1 == "/13" ] && { echo "255.248.0.0"; exit 0; } 
[ $1 == "/14" ] && { echo "255.252.0.0"; exit 0; } 
[ $1 == "/15" ] && { echo "255.254.0.0"; exit 0; } 
[ $1 == "/16" ] && { echo "255.255.0.0"; exit 0; } 
[ $1 == "/17" ] && { echo "255.255.128.0"; exit 0; } 
[ $1 == "/18" ] && { echo "255.255.192.0"; exit 0; } 
[ $1 == "/19" ] && { echo "255.255.224.0"; exit 0; } 
[ $1 == "/20" ] && { echo "255.255.240.0"; exit 0; } 
[ $1 == "/21" ] && { echo "255.255.248.0"; exit 0; } 
[ $1 == "/22" ] && { echo "255.255.252.0"; exit 0; } 
[ $1 == "/23" ] && { echo "255.255.254.0"; exit 0; } 
[ $1 == "/24" ] && { echo "255.255.255.0"; exit 0; } 
[ $1 == "/25" ] && { echo "255.255.255.128"; exit 0; } 
[ $1 == "/26" ] && { echo "255.255.255.192"; exit 0; } 
[ $1 == "/27" ] && { echo "255.255.255.224"; exit 0; } 
[ $1 == "/28" ] && { echo "255.255.255.240"; exit 0; } 
[ $1 == "/29" ] && { echo "255.255.255.248"; exit 0; } 
[ $1 == "/30" ] && { echo "255.255.255.252"; exit 0; } 

echo "$0 - Error: $1 is not a valid input."
exit 1


$ cat netmask_2_cidr

#!/bin/bash

#
# Description: it converts netmasks from Classless-Inter-Domain-Routing to Decimal-Dotted notation
#
# Usage: netmask_2_cidr 
#
# Example: NETMASK=$(./netmask_2_cidr 255.255.254.0)
#
# Author: VDA
#
# Last update: 2019.05.20
#

[ $# -ne 1 ] && { echo "Usage: $0 Decimal_Dotted_Notation_netmask"; exit 1; }

[ $1 == "128.0.0.0" ] && { echo "/1"; exit 0; }
[ $1 == "192.0.0.0" ] && { echo "/2"; exit 0; }
[ $1 == "224.0.0.0" ] && { echo "/3"; exit 0; }
[ $1 == "240.0.0.0" ] && { echo "/4"; exit 0; }
[ $1 == "248.0.0.0" ] && { echo "/5"; exit 0; }
[ $1 == "252.0.0.0" ] && { echo "/6"; exit 0; }
[ $1 == "254.0.0.0" ] && { echo "/7"; exit 0; }
[ $1 == "255.0.0.0" ] && { echo "/8"; exit 0; }
[ $1 == "255.128.0.0" ] && { echo "/9"; exit 0; }
[ $1 == "255.192.0.0" ] && { echo "/10"; exit 0; }
[ $1 == "255.224.0.0" ] && { echo "/11"; exit 0; }
[ $1 == "255.240.0.0" ] && { echo "/12"; exit 0; }
[ $1 == "255.248.0.0" ] && { echo "/13"; exit 0; }
[ $1 == "255.252.0.0" ] && { echo "/14"; exit 0; }
[ $1 == "255.254.0.0" ] && { echo "/15"; exit 0; }
[ $1 == "255.255.0.0" ] && { echo "/16"; exit 0; }
[ $1 == "255.255.128.0" ] && { echo "/17"; exit 0; }
[ $1 == "255.255.192.0" ] && { echo "/18"; exit 0; }
[ $1 == "255.255.224.0" ] && { echo "/19"; exit 0; }
[ $1 == "255.255.240.0" ] && { echo "/20"; exit 0; }
[ $1 == "255.255.248.0" ] && { echo "/21"; exit 0; }
[ $1 == "255.255.252.0" ] && { echo "/22"; exit 0; }
[ $1 == "255.255.254.0" ] && { echo "/23"; exit 0; }
[ $1 == "255.255.255.0" ] && { echo "/24"; exit 0; }
[ $1 == "255.255.255.128" ] && { echo "/25"; exit 0; }
[ $1 == "255.255.255.192" ] && { echo "/26"; exit 0; }
[ $1 == "255.255.255.224" ] && { echo "/27"; exit 0; }
[ $1 == "255.255.255.240" ] && { echo "/28"; exit 0; }
[ $1 == "255.255.255.248" ] && { echo "/29"; exit 0; }
[ $1 == "255.255.255.252" ] && { echo "/30"; exit 0; }

echo "$0 - Error: $1 is not a valid input."
exit 1


$ cat dec_2_bin

#!/bin/bash

#
# Description: it converts positive integers numbers from decimal 
#  to binary notation
#
# Usage: dec_2_bin 
#
# Example: bin=$(./dec_2_bin 255)
#
# Author: VDA
#
# Last update: 2019.05.20
#

[ $# -ne 1 ] && { echo "Usage: $0 decimal_value"; exit 1; } 

if ! [[ $1 =~ ^[0-9]+$ ]]; then
        echo "$0 - Error: $1 is an invalid input."
        exit 1
fi

bin=""
dec=$1

if [ $dec -eq 0 ]; then
        bin=0
else
        while [ $dec -ne 0 ]
        do
                bit=$((dec%2))
                dec=$((dec/2))
                bin=$bit$bin
        done 
fi

echo $bin
exit 0


$ cat bin_2_dec

#!/bin/bash

#
# Description:  it converts positive integers numbers from binary 
#               to decimal notation 
#
# Usage: bin_2_dec  
#
# Example: n=$(./bin_2_dec 1100)
#

[ $# -ne 1 ] && { echo "Usage: $0 binary_value"; exit 1; }

if ! [[ $1 =~ ^[01]+$ ]]; then
        echo "$0 - Error: \"$1\" is an invalid input."
        exit 1
fi

bin=$1; 
bin_lenght=$(echo -n $bin | wc -m)

if [ $bin_lenght -eq 1 ]; then
        dec=$bin
else
        dec=0
        k=0
        while [ $k -lt $bin_lenght ]
        do
                bit=${bin:k:1}
                exp=$((bin_lenght-k-1))
                dec=$((dec+bit*2**exp))
                k=$((k+1))  
        done
fi

echo $dec
exit 0


$ cat ip_addr-dec_2_bin

#!/bin/bash

#
# Description: it converts the input IP address from decimal-dotted to binary notation 
#
# Usage: ip_addr-dec_2_bin 
#
# Example: bin_ip_addr=$(./ip_addr-dec_2_bin 192.168.1.17)             
#
# Author: VDA
#
# Last update: 2019.05.23
#

[ $# -ne 1 ] && { echo "Usage: $0 dotted_decimal_notation_ip_address"; exit 1; }

dir=$(dirname $0)

$dir/ip_addr_check $1 || { echo "$0 - Error: $1 is not an IPv4 address."; exit 1; }

bin_ip=""
for i in 1 2 3 4
do
        dec_oct=$(echo $1 | cut -d \. -f $i)
        bin_oct=$($dir/dec_2_bin $dec_oct)
        bin_oct_len=$(echo -n $bin_oct | wc -m)
        while [ $bin_oct_len -lt 8 ]
        do
                bin_oct=0$bin_oct
                bin_oct_len=$((bin_oct_len+1))
        done
        bin_ip=$bin_ip$bin_oct
done

echo $bin_ip

exit 0


$ cat ip_addr-bin_2_dec

#!/bin/bash

#
# Description: it converts the input IP address from binary to decimal-dotted notation
#
# Usage: ip_addr-bin_2_dec <32_bit_binary_ip>
#
# Example: dec_ip_addr=$(./ip_addr-bin_2_dec 11111111111111111111111100000000)
#
# Author: VDA
#
# Last update: 2019.05.23
#

[ $# -ne 1 ] && { echo "Usage: $0 binary_ip_address"; exit 1; }

if ! [[ $1 =~ ^[01]{32}$ ]]; then
        echo "$0 - Error: $1 is an invalid input."
        exit 1
fi

dir=$(dirname $0)
bin_ip=$1
dec_ip=""
for i in 0 8 16 24  
do
        bin_oct=${bin_ip:i:8}
        dec_oct=$($dir/bin_2_dec $bin_oct)
        dec_ip=$dec_ip$dec_oct
        [ $i -ne 24 ] && dec_ip=$dec_ip\.
done
echo $dec_ip
exit 0


$ cat network_calc

#!/bin/bash

#
# Description: it calculates from an IP address and subnet mask:
#
#                       - network id
#                       - first network address
#   - last network address
#                       - broadcast address 
# 
# Usage: network_calc  
#
# Example: ret_val=$(./network_calc 192.168.1.1 /22)
#  network_id=cut $ret_val -d " " - f 1
#  first_ip_addr=cut $ret_val -d " " - f 2
#  last_ip_addr=cut $ret_val -d " " - f 3
#  broadcast_ip=cut $ret_val -d " " - f 4
#
# Author: VDA
#
# Last update: 2019.05.23
# 

[ $# -ne 2 ] && { echo "Usage: $0 ip_address {decimal_dotted_notation | cidr_notation}_netmask"; exit 1; }

dir=$(dirname $0)

$dir/ip_addr_check $1 || { echo "$0 - Error: $1 is an invalid input."; exit 1; }
$dir/netmask_check $2 || { echo "$0 - Error: $2 is an invalid input."; exit 1; }

dec_ip=$1
[[ $2 =~ ^\/ ]] && dec_netmask=$($dir/cidr_2_netmask $2) || dec_netmask=$2 

bin_ip=$($dir/ip_addr-dec_2_bin $dec_ip)
bin_netmask=$($dir/ip_addr-dec_2_bin $dec_netmask)

bin_network_id=""
bin_first_network_ip=""
bin_last_network_ip=""
bin_broadcast_ip=""

i=1

while [ $i -le 32 ]
do
        ip_bit=$(echo ${bin_ip:((i-1)):1})
        netmask_bit=$(echo ${bin_netmask:((i-1)):1})

        if [ $netmask_bit -eq 1 ]; then
                bin_network_id=$bin_network_id$ip_bit
                bin_first_network_ip=$bin_first_network_ip$ip_bit
                bin_last_network_ip=$bin_last_network_ip$ip_bit
                bin_broadcast_ip=$bin_broadcast_ip$ip_bit
        else
                bin_network_id=$bin_network_id"0"
                if [ $i -lt 32 ]; then
                        bin_first_network_ip=$bin_first_network_ip"0"
                        bin_last_network_ip=$bin_last_network_ip"1"
                else
                        bin_first_network_ip=$bin_first_network_ip"1"
                        bin_last_network_ip=$bin_last_network_ip"0"
                fi
                bin_broadcast_ip=$bin_broadcast_ip"1"
        fi

        i=$((i+1))
done

network_id=$($dir/ip_addr-bin_2_dec $bin_network_id)
first_network_ip=$($dir/ip_addr-bin_2_dec $bin_first_network_ip)
last_network_ip=$($dir/ip_addr-bin_2_dec $bin_last_network_ip)
broadcast_ip=$($dir/ip_addr-bin_2_dec $bin_broadcast_ip)

#echo "Network ID: $network_id"
#echo "First IP: $first_network_ip"
#echo "Last IP: $last_network_ip"
#echo "IP addresses range: $first_network_ip - $last_network_ip"
#echo "Broadcast IP address: $broadcast_ip"

echo "$network_id $first_network_ip $last_network_ip $broadcast_ip"

exit 0 


$ cat network_scan

#!/bin/bash

#
# Description: it scans network for connected/not_connected IP address
#
# Usage: netscan  
#
# Example: ./netscan 10.8.110.130 10.8.110.170
#
# Author: VDA
#
# Last update: 2019.05.23
#

[ $# -ne 2 ] && { echo "Usage: $0 start_ip_address end_ip_address"; exit 1; }

dir=$(dirname $0)

$dir/ip_addr_check $1 || { echo "$0 - Error: $1 is an invalid input."; exit 1; }
$dir/ip_addr_check $2 || { echo "$0 - Error: $2 is an invalid input."; exit 1; }
[[ $($dir/ip_addr-dec_2_bin $1) -gt $($dir/ip_addr-dec_2_bin $2) ]] && { echo "$0 - Error: $1 is greater than $2."; exit 1; }

ip_addr_1=$1
ip_addr_2=$2

oct1=$(echo $ip_addr_1 | cut -d "." -f 1)
oct2=$(echo $ip_addr_1 | cut -d "." -f 2)
oct3=$(echo $ip_addr_1 | cut -d "." -f 3)
oct4=$(echo $ip_addr_1 | cut -d "." -f 4)

next_ip_addr=$ip_addr_1
ping -c 1 -w 1 $next_ip_addr &> /dev/null
status=$?
echo -n -e "$next_ip_addr \t"
if [ $status -eq 0 ]; then
        echo "connected"
else 
        echo "not_connected"
fi 

while [ $next_ip_addr != $ip_addr_2 ]
do

        if [ $oct4 -lt 255 ]; then
                oct4=$((oct4+1))
        else
                if [ $oct3 -lt 255  ]; then
                        oct3=$((oct3+1))
                        oct4=0
                else
                        if [ $oct2 -lt 255 ]; then
                                oct2=$(($oct2+1))
                                oct3=0
                                oct4=0
                        else
                                if [ $oct1 -lt 255 ]; then
                                        oct1=$((oct1+1))
                                        oct2=0
                                        oct3=0
                                        oct4=0
                                fi
                        fi
                fi       
        fi
 
        next_ip_addr=$oct1.$oct2.$oct3.$oct4
        ping -c 1 -w 1 $next_ip_addr &> /dev/null
        status=$? 
        echo -n -e "$next_ip_addr \t"
        if [ $status -eq 0 ]; then
                echo "connected"
        else
                echo "not_connected"
        fi
done

exit 0




$ cat if_config

#!/bin/bash

#
# Description: it configures network card with ip address and default gateway 
#
# Usage: set_ip_addr    
#
# Example: ./set_ip_addr eth0 192.168.1.117 255.255.255.0 192.168.1.1 
#       
#        or
#
#  ./set_ip_addr eth0 192.168.1.117 /24
#
# Author: VDA
#
# Last update: 2019.05.23
#

dir=$(dirname $0)

[ $EUID -ne 0 ] && { echo "$0 - Error: you must be root to run this script."; exit 1; } 
[ $# -ne 4 ] && { echo "Usage: $0     "; exit 1; }
ip link | grep $1 &> /dev/null || { echo "$0 - Error: $1 is not a network interface."; exit 1; }
[ $1 == "lo" ] && { echo "$0 - Error: \"$1\" is not a valid network interface."; exit 1; }
$dir/ip_addr_check $2 || { echo "$0 - Error: $2 is not an IP Address."; exit 1; }
$dir/netmask_check $3 || { echo "$0 - Error: $3 is not a netmask."; exit 1; }
$dir/ip_addr_check $4 || { echo "$0 - Error: $4 is not an IP Address."; exit 1; }

a=$($dir/network_calc $2  $3);
b=$($dir/network_calc $4  $3);
[[ $a != $b ]] && { echo "$0 - Error: IP addresses $2 and $4 must be in the same network"; exit 1; }
[ $2 == $(echo $a | cut -d " " -f 1) ] && { echo "$0 - Error: $2 is not an acceptable IP address"; exit 1; }
[ $4 == $(echo $a | cut -d " " -f 1) ] && { echo "$0 - Error: $4 is not an acceptable IP address"; exit 1; }
[ $2 == $(echo $a | cut -d " " -f 4) ] && { echo "$0 - Error: $2 is not an acceptable IP address"; exit 1; }
[ $4 == $(echo $a | cut -d " " -f 4) ] && { echo "$0 - Error: $4 is not an acceptable IP address"; exit 1; }

if_id=$1
ip_addr=$2
[[ $3 =~ ^\/ ]] && cidr=$3 || cidr=$(./netmask_2_cidr $3)
dg=$4

ip link show up | grep $if_id &> /dev/null || ip link set $if_id up

ip addr flush dev $if_id
ip route flush dev $if_id

ip addr add ${ip_addr}${cidr} dev $if_id
ip route add $dg dev $if_id
ip route add default via $dg dev $if_id

exit 0


$ cat set_dns

#!/bin/bash

#
# Description: it sets the Domain Name Servers (default: Google DNS) 
#
# Usage: //set_dns [] []
#
# Example: ./set_dns 192.168.1.1 
#
# Author:  VDA
#
# Last update: 2019.05.23
#

[ $USER != "root" ] && { echo "$0 - Error: you must be root to run this script."; exit 1; } 
[ $# -gt 2 ] && { echo "Usage: $0 [ip_address_1] [ip-address_2]."; exit 1; }

dns1=${1:- 8.8.8.8}
dns2=${2:- 8.8.4.4}

./check_ip_addr $dns1 || { echo "$0 - Error: \"$dns1\" is not an IP Address."; exit 1; }
./check_ip_addr $dns2 || { echo "$0 - Error: \"$dns2\" is not an IP Address."; exit 1; }

[ -e /etc/resolv.conf ] && cp /etc/resolv.conf /etc/resolv.conf.bck
# chmod go+w /etc/resolv.conf; echo -e "nameserver $dns1 \nnameserver $dns2" > /etc/resolv.conf; chmod go-w /etc/resolv.conf
echo -e "nameserver $dns1 \nnameserver $dns2" | tee /etc/resolv.conf &> /dev/null

exit 0


$ cat set_proxy

#!/bin/bash

#
# Description: it sets environment variables for proxy server  
#
# Usage: //set_proxy [{http|https}://][user[:password]@]proxy_server[:port]
#
# Example: ./set_proxy http://john:secret_password@10.854.23:8080
#
# Author:  VDA
#
# Last update: 2019.05.23
#

# [ $USER != "root" ] && { echo "$0 - Error: you must be root to run this script."; exit 1; } 
[ $# -ne 1 ] && { echo "Usage: $0 [{http|https}://][user[:password]@]proxy_server[:port]"; exit 1; 

export http_proxy=$1
export https_proxy=$1
export ftp_proxy=$1
export rsync_proxy=$1
export no_proxy="localhost,127.0.0.1"

exit 0

Per poter utilizzare gli script è necessario copiarli tutti nella stessa directory e renderli eseguibili.

Commenti