In uno script bash ho un indirizzo IP come 192.168.1.15 e una maschera di rete come 255.255.0.0. Ora voglio calcolare l'indirizzo iniziale di questa rete, ovvero utilizzare il & -operator su entrambi gli indirizzi. Nell'esempio, il risultato sarebbe 192.168.0.0. Qualcuno ha qualcosa di simile pronto? Sto cercando un modo elegante per trattare con gli indirizzi IP da bashDato l'IP e la maschera di rete, come posso calcolare l'indirizzo di rete usando bash?
risposta
Usa bit a bit &
(AND
) Operatore:
$ IFS=. read -r i1 i2 i3 i4 <<< "192.168.1.15"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.0.0"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0
Esempio con un altro IP e la maschera:
$ IFS=. read -r i1 i2 i3 i4 <<< "10.0.14.97"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.255.248"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
10.0.14.96
Grazie mille! Esattamente quello che stavo cercando, bellissimo! – Christian
Questo è geniale. Grazie per aver dedicato del tempo per svilupparlo. – jacksonecac
Grande risposta , anche se errore di battitura in risposta sopra.
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$(($i2 <-- $i2 should be i2
se qualcuno sa come calcolare l'indirizzo di broadcast (XOR rete), quindi calcolare i nodi utilizzabili tra rete e broadcast Sarei interessato in quei passi successivi. Devo trovare gli indirizzi in una lista all'interno di un/23.
Risolto il problema, grazie per averlo notato. – kamituel
Solo l'aggiunta di un'alternativa se avete il prefisso solo rete disponibile (senza maschera di rete):
IP=10.20.30.240
PREFIX=26
IFS=. read -r i1 i2 i3 i4 <<< $IP
IFS=. read -r xx m1 m2 m3 m4 <<< $(for a in $(seq 1 32); do if [ $(((a - 1) % 8)) -eq 0 ]; then echo -n .; fi; if [ $a -le $PREFIX ]; then echo -n 1; else echo -n 0; fi; done)
printf "%d.%d.%d.%d\n" "$((i1 & (2#$m1)))" "$((i2 & (2#$m2)))" "$((i3 & (2#$m3)))" "$((i4 & (2#$m4)))"
Alcune funzioni Bash che riassumono tutte le altre risposte.
ip2int()
{
local a b c d
{ IFS=. read a b c d; } <<< $1
echo $(((((((a << 8) | b) << 8) | c) << 8) | d))
}
int2ip()
{
local ui32=$1; shift
local ip n
for n in 1 2 3 4; do
ip=$((ui32 & 0xff))${ip:+.}$ip
ui32=$((ui32 >> 8))
done
echo $ip
}
netmask()
{
local mask=$((0xffffffff << (32 - $1))); shift
int2ip $mask
}
broadcast()
{
local addr=$(ip2int $1); shift
local mask=$((0xffffffff << (32 -$1))); shift
int2ip $((addr | ~mask))
}
network()
{
local addr=$(ip2int $1); shift
local mask=$((0xffffffff << (32 -$1))); shift
int2ip $((addr & mask))
}
Bello, ma una riga di esempio mi avrebbe risparmiato 15 minuti per capire le tue aspettative sui parametri .. "network 192.168.8.1 31" o "netmask 16" –
Oltre a rispondere a @Janci
IP=10.20.30.240
PREFIX=26
IFS=. read -r i1 i2 i3 i4 <<< $IP
D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
binIP=${D2B[$i1]}${D2B[$i2]}${D2B[$i3]}${D2B[$i4]}
binIP0=${binIP::$PREFIX}$(printf '0%.0s' $(seq 1 $((32-$PREFIX))))
# binIP1=${binIP::$PREFIX}$(printf '0%.0s' $(seq 1 $((31-$PREFIX))))1
echo $((2#${binIP0::8})).$((2#${binIP0:8:8})).$((2#${binIP0:16:8})).$((2#${binIP0:24:8}))
- 1. Come posso calcolare l'IP broadcast da un indirizzo IP e una maschera di rete in Perl?
- 2. Maschera di rete per CIDR in Ruby
- 3. Calcola CIDR da una maschera di rete specifica - Java
- 4. codice c per la maschera di rete valida
- 5. Come calcolare il numero di parametri di una rete LSTM?
- 6. Come posso copiare i file di rete usando Robocopy?
- 7. Conversione dell'indirizzo CIDR in subnet mask e indirizzo di rete
- 8. DhcpInfo non risponde alla maschera di rete in Android Lolipop
- 9. Quali sono gli effetti dell'impostazione errata della maschera di rete?
- 10. Utilizzo di processo di rete con PowerShell
- 11. Java e Windows 7: ottenendo in modo affidabile la maschera di rete IPv4?
- 12. Come posso rilevare la reale disponibilità di rete?
- 13. Disabilitare la connessione di rete
- 14. Qualcuno conosce un componente java per verificare se l'indirizzo IP proviene da una particolare rete/maschera di rete?
- 15. Come posso ottenere l'indirizzo IP di una stampante di rete dato il nome della porta usando l'API Win32?
- 16. Mappare la rete di collegamento tra blog usando R?
- 17. Previsioni del tempo usando una rete neurale
- 18. Come connettersi alla rete WiFi usando Python?
- 19. Come posso calcolare o monitorare l'allenamento di una rete neurale in pybrain?
- 20. HttpClient.GetAsync con credenziali di rete
- 21. Neurolab riqualificare la rete
- 22. Come posso rilevare l'iPhone sulla rete?
- 23. Android Come calcolare l'utilizzo della rete pacchetto/dati
- 24. carico di rete e tempo di interlineamento
- 25. esiste un codice per indirizzo bitwise e ipv6 e maschera di rete (prefisso)?
- 26. Come montare una directory di rete usando python?
- 27. Come posso rilevare a livello di programmazione la rete EDGE o la rete non valida in iPhone?
- 28. Come posso imparare _really_ programmazione di rete di basso livello?
- 29. OpenCV con telecamere di rete
- 30. binding socket all'interfaccia di rete
si può considerare 'ipcalc'. – dwalter
ipcalc è uno script perl cgi che può essere scaricato. Grazie, è un'ottima fonte per chiunque voglia implementarlo in PERL. Tuttavia, stavo cercando una soluzione in bash, ma perl avrebbe funzionato anche in uno script di shell. – Christian
no intendo la riga di comando di Unix su ipcalc. vedi http://answers.oreilly.com/topic/411-how-to-calculate-subnets-with-ipcalc/ per ulteriori informazioni. In alternativa puoi anche usare sipcalc (anche uno strumento cli) che supporta IPv6 – dwalter