Voici quelques exemples prĂȘts Ă lâemploi avec la commande ip, sa sortie JSON et la commande jq.
Liste des adresses IPv4 disponibles sur la machine
Pour obtenir un résultat au format texte :
ip -4 --json addr show | jq -r '.[] |
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[].local'
Pour obtenir un résultat au format JSON :
ip -4 --json addr show | jq 'map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[].local
)'
Exemple de résultat au format texte :
192.168.1.101
Exemple de résultat au format JSON :
[
"192.168.1.43",
"172.17.0.1"
]
- Lâoption
-4
de la commande ip est un raccourci pour-family inet
, - On ne souhaite pas obtenir lâadresse 127.0.0.1Â ; dâoĂč le
select( .flags | index("LOOPBACK") | not )
, - On souhaite avoir que les interfaces actuellement fonctionnelles :
select( .flags | index( "UP") )
.
Liste des adresses IPv6 globales disponibles sur la machine
Pour obtenir un résultat au format texte :
ip -6 --json addr show | jq -r '.[] |
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[] |
select( .scope == "global" ) |
.local'
Pour obtenir un résultat au format JSON :
ip -6 --json addr show | jq 'map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[] |
select( .scope == "global" ) |
.local
)'
Exemple de résultat au format texte :
21b4:e0a:56c:a020:356f:3b5f:672:8f52
Exemple de résultat au format JSON :
[
"21b4:e0a:5c6:a020:9c69:ecc0:f040:33da",
"21b4:e0a:5c6:a020:2d8:61ff:fe05:adfc"
]
- Lâoption
-6
de la commande ip est un raccourci pour-family inet6
, - On ne souhaite pas obtenir lâadresse ::1Â ; dâoĂč le
select( .flags | index("LOOPBACK") | not )
, - On souhaite avoir que les interfaces actuellement fonctionnelles :
select( .flags | index( "UP") )
, - On ne veut que les adresses globales ; dâoĂč le
select( .scope == "global" )
.
Liste des adresses IP disponibles sur la machine
Pour obtenir un résultat au format texte :
ip --json addr show | jq -r '.[] |
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[].local'
Pour obtenir un résultat au format JSON :
ip --json addr show | jq 'map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.addr_info[].local
)'
Exemple de résultat au format texte :
192.168.1.43
21b4:e0a:56c:a020:356f:3b5f:672:8f52
fe80::2d8:61ff:fe05:adfc
172.17.0.1
Exemple de résultat au format JSON :
[
"192.168.1.43",
"21b4:e0a:5c6:a020:9c69:ecc0:f040:33da",
"21b4:e0a:5c6:a020:2d8:61ff:fe05:adfc",
"fe80::2d8:61ff:fe05:adfc",
"172.17.0.1"
]
- Lâoption
-6
de la commande ip est un raccourci pour-family inet6
, - On ne souhaite pas obtenir lâadresse ::1Â ; dâoĂč le
select( .flags | index("LOOPBACK") | not )
, - On souhaite avoir que les interfaces actuellement fonctionnelles :
select( .flags | index( "UP") )
, - On ne veut que les adresses globales ; dâoĂč le
select( .scope == "global" )
.
Liste des interfaces réseaux présentes sur la machine
Pour obtenir un résultat au format texte :
ip --json link | jq -r '.[] | .ifname'
Pour obtenir un résultat au format JSON :
ip --json link | jq 'map( .ifname )'
Exemple de résultat au format texte :
lo
enp3s0
wlo1
docker0
vboxnet0
Exemple de résultat au format JSON :
[
"lo",
"enp3s0",
"wlo1",
"docker0"
]
Liste des interfaces réseaux présente sur la machine avec une adresse IP
Ce rĂ©sultat exclu Ă©galement la boucle locale des rĂ©sultats, puisquâelle nâest gĂ©nĂ©ralement pas pertinente.
Pour obtenir un résultat au format texte :
ip --json link | jq -r '.[] |
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.ifname'
Pour obtenir un résultat au format JSON :
ip --json link | jq 'map(
select( .flags | index("LOOPBACK") | not ) |
select( .flags | index( "UP") ) |
.ifname
)'
Exemple de résultat au format texte :
enp3s0
docker0
Exemple de résultat au format JSON :
[
"enp3s0",
"docker0"
]
- On ne souhaite pas obtenir lâinterface liĂ© Ă la boucle locale ; dâoĂč le
select( .flags | index("LOOPBACK") | not )
, - On souhaite avoir que les interfaces actuellement fonctionnelles :
select( .flags | index( "UP") )
,
Comparaison du résultat au format texte et JSON
Suivant ce que lâon souhaite faire le rĂ©sultat au format texte est bien adapter.
Si vous souhaitez uniquement un affichage oĂč faire un traitement sur chaque rĂ©sultat câest parfait :
La syntaxe générale sera :
COMMANDES | while read -r VALUEÂ ; do TRAITEMENT "${VALUE}"Â ; done
Une autre approche avec une sortie texte (option -r
) est dâutiliser les capacitĂ©s de jq pour construire le paramĂštre dont vous avez besoin :
Prenons le cas de la commande nmap demande pour cette option lâadresse du rĂ©seau qui doit ĂȘtre scannĂ©.
Typiquement câest une valeur du genre 192.168.1.0/24
, noté que le /24
indique que la partie .0
de lâadresse est ignorĂ©e,
on peut donc utiliser lâadresse IP de la machine par 192.168.1.150/24
qui aura exactement le mĂȘme effet.
On peut construire cette chaßne directement avec jq :
.local + "/" + ( .prefixlen | tostring )
Finalement on peut écrire :
ip -4 --json addr show |
jq -r 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | .addr_info[] | (.local + "/" + (.prefixlen|tostring) ) ) | .[]' |
while read -r V ; do echo "${V}" ; sudo nmap -sn -T4 "${V}" | grep 'Nmap scan report' ; done
ou si lâon souhaite lancer nmap quâune seule fois :
sudo nmap -sn $(
ip -4 --json addr show |
jq -r 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | .addr_info[] | (.local + "/" + (.prefixlen|tostring) ) ) | .[]'
) | grep 'Nmap scan report for'
Avec une gestion des erreurs et un reformatage du résultat en JSON :
function scan_networks {
# RécupÚre la liste des réseaux de classe C (24)
local networks_json=
networks_json=$(
ip -4 --json addr show |
jq -r 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | .addr_info[] | select( .prefixlen == 24 ) | (.local + "/" + (.prefixlen|tostring) ) ) | .[]'
) || return $?
# Scan des réseaux
local nmap_values=
nmap_values="$(
set -x
sudo nmap -sn ${networks_json} | grep 'Nmap scan report for'
)" || return $?
# On récupÚre deux type de lignes:
# Nmap scan report for hostname124.your.network (192.168.1.124)
# Nmap scan report for 192.168.1.149
# Reformate en JSON
sed -E \
-e 's;^.*[[:blank:]]for[[:blank:]](.*)[[:blank:]]\((.*)\)$;{"name":"\1","ip":"\2"};g' \
-e 's;^.*[[:blank:]]for[[:blank:]](.*)$;{"name":"\1","ip":"\1"};g' \
<<<"${nmap_values}" |
jq -s .
}
scan_networks
Mais si pour le traitement vous avez besoin dâautres valeurs la sortie JSON est peut-ĂȘtre mieux adaptĂ©e.
En effet, vous pouvez avoir besoin de plusieurs valeurs, Ă partir dâune seule valeur comme cela :
ip --json addr show | jq 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | .addr_info[] | .local )'
Il est finalement assez facile dâobtenir plusieurs valeurs par entrĂ©e.
ip --json addr show | jq 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | .addr_info[] | { local, prefixlen } )'
-
Installation de « nmap »
nmap ne fait gĂ©nĂ©ralement pas partie des paquets installĂ©s par dĂ©faut, sâil nâest pas prĂ©sent, vous pouvez lâobtenir Ă lâaide de :
sudo apt install -y nmap
Liens
- đ Filtrer par valeur avec « jq »,
- đ§ PrĂ©sentation de la commande « ip »,
- đ§ DĂ©tecter si une machine supporte IPv6,
- La FAQ de jq en anglais,
- Le manuel de jq en anglais (Vous pouvez choisir la version de jq).
኿