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
32_bit_binary_ip>
$ 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
Commenti
Posta un commento