cClaude.rocks ☕ Le blog

L'informatique et les nouvelles technologies

Menu

« ifconfig » versus « ip »

La commande ifconfig commence à disparaître comme outil de base sur certaine distributions Linux. Elle est avantageusement remplacée par la commande ip.

Les notions de base

Si comme moi vous être habitué à utiliser ipconfig, l’utilisation de la commande ip est un peu déroutante au début.

Cette commande prend en charge plein d’options et à première vue un man ip laisse plus dubitatif que n’éclaire, première vue, sur son utilisation.

La grande différence qu’il y a sur ces deux commandes et que ip s’applique sur un type d’objet qui vous devez préciser. Les informations données par la commande ifconfig, concerne les adresses de réseaux de votre machine et l’interface d’accès au réseau. Dans les termes de la commande ip cela se traduit par l’objet address et l’objet link.

Une fois que vous avez identifié le type d’objet, d’information que vous souhaitez, vous devez spécifier ce que vous voulez faire avec. Encore une fois, la commande ip vous donne plusieurs options. Vous pouvez généralement ajouter (add), supprimer (delete), définir (set) et afficher (show) (ou répertorier) des objets. Si vous ne spécifiez pas d’action, par défaut, la commande ip suppose que vous souhaiter un affichage.


Voici quelques exemples prendre cela plus clair.


Comment puis-je voir l’adresse IP de toutes mes interfaces réseaux ?

Vous pouvez utiliser la commande ip address pour obtenir les adresses IP ou IPv6 de votre appareil. Si taper tout cela est trop pour vous, il est possible d’utiliser ip addr voir même ip a.

Donc, pour obtenir les adresses de toutes vos interfaces réseau, tapez quelque chose comme ceci :

ip address show

ou

ip addr show

Vous obtiendrez quelque chose comme ça :

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether de:ad:be:ef:co:o1 brd ff:ff:ff:ff:ff:ff
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether de:ad:be:ef:no:op brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
       valid_lft 84787sec preferred_lft 84787sec

Notez que la commande ip addr, contrairement à ifconfig, répertorie toutes les interfaces réseau, qu’elles soient montées ou non.


Obtenir des informations de configuration sur vos interfaces réseau

Vous pouvez utiliser la commande ip link pour obtenir des détails sur l’état et les caractéristiques de votre interface réseau :

ip link show

La commande ip link ne permet pas de savoir si votre appareil est utilisé par des protocoles de couche supérieure. Il affiche simplement tout périphérique réseau sur lequel un pilote est chargé. Il vous donne également des informations sur tous les cartes, quel que soit leur état.


Obtenir l’adresse IP d’une interface spécifique ?

Si vous n’avez pas besoin des informations de configuration de toutes les interfaces, mais seulement d’une seule, exécutez ip addr show suivi du nom d’une carte spécifique (alias dev).

Pour obtenir l’adresse du périphérique Ethernet nommé enp3s0 :

ip addr show dev enp3s0

Comment activer ou désactiver une interface réseau ?

Pour activer une interface réseau, exécutez la commande ip link avec le nom de l’interface suivi du mot clé up. Vous devez être connecté en tant qu’utilisateur root ou utiliser sudo pour exécuter la commande. Dans tous les cas vous devez l’utiliser avec les privilèges du super utilisateur.

sudo ip link set dev wlo1 up

Pour désactiver l’interface, il suffit d’utiliser le mot clé down à la place de up.

sudo ip link set dev wlo1 down

Comment définir une adresse IP pour une interface ?

Vous pouvez définir une adresse IP pour une interface à l’aide de la commande ip addr add. Contrairement à ifconfig, qui met en place ce changement de manière temporaire, le faire avec la commande ip addr add engendre une modification de la configuration du système.

Pour définir une adresse IP statique, indiquez le nom de l’interface et l’adresse IP. Comme vous l’avez peut-être deviné, vous avez besoin des privilèges root pour y parvenir. Ainsi, nous attribuons l’adresse IP 192.168.1.14 à l’interface eth1 à l’aide de la commande suivante :

sudo ip addr add 192.168.1.14 dev eth1

Notez bien qu’ici on souhaite ajouter une adresse IP à un périphérique particulier (dev). Vous pouvez confirmer que tout s’est déroulé comme prévu en utilisant la commande ip addr show comme ceci :

ip addr show eth1

De manière assez évidente, pour retirer cette adresse IP de l’interface, il suffit d’utiliser le mot clé del à la place de `add’ :

sudo ip addr del 192.168.1.14 dev eth1

Que faire si je souhaite afficher des adresses d’une manière spécifique ?

Vous pouvez décoder et afficher toutes les adresses de protocole en utilisant le schéma de dénomination de vos rêves. Vous devez modifier la commande ip générique suivante pour spécifier un type particulier de famille d’adresses :

ip -f [famille] addr

Vous pouvez spécifier les types de famille d’adresses suivants : inet (IPv4), inet6 (IPv6), bridge ou link.

Ainsi

ip -f inet addr show dev wlo1

donnera

3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
       valid_lft 86203sec preferred_lft 86203sec

Coloration de l’affichage de la commande

Pour lire de manière plus agréable les résultats, je vous encourage à utiliser l’option -c qui active la coloration.

ip -c addr show

Et pour ne pas avoir à taper cela à chaque fois, c’est une bonne idée d’ajouter la ligne suivant dans votre fichier .bashrc.

alias ip='ip -c'

La commande ip et l’automatisation

La sortie de la commande ip n’est pas facile à analyser et il peut sembler difficile de l’utiliser dans des scripts. En réalité, il n’en est rien puisque l’option --json permet d’obtenir un affichage au format JSON.

ip --json addr

En conjonction avec la commande jq, il est alors extrêmement facile d’extraire les informations souhaitées.

ip --json addr | jq .

VOici ce que cela donne :

Affiche la liste des interfaces réseaux disponible au format JSON.

ip --json addr | jq '[ .[] | .ifname ]'

On obtient alors un flux JSON du type :

[
  "lo",
  "enp3s0",
  "wlo1"
]

Affiche la liste des interfaces réseaux disponible au format brut.

ip --json addr | jq -r '.[] | .ifname'
lo
enp3s0
wlo1

Ce type de résultat peut être lu simplement par une boucle bash contenant la commande read.

Lister seulement les interfaces actives :

ip --json addr show |
jq -r '.[] | select( .flags | index( "UP") ).ifname'

Reprenons ce code pour produire un flux JSON en sortie :

ip --json addr show |
jq '[ .[] | select( .flags | index( "UP") ) | { "ifname": .ifname } ]'

Cherchons à obtenir les adresses IP par interface réseaux :

ip --json addr show |
jq '[ .[] | select( .flags | index( "UP") ) | { "ifname": .ifname, "addr_info": .addr_info }]'

On obtient quelque chose comme cela :

  {
    "ifname": "lo",
    "addr_info": [
      {
        "family": "inet",
        "local": "127.0.0.1",
        "prefixlen": 8,
        "scope": "host",
        "label": "lo",
        "valid_life_time": 4294967295,
        "preferred_life_time": 4294967295
      },
      {
        "family": "inet6",
        "local": "::1",
        "prefixlen": 128,
        "scope": "host",
        "valid_life_time": 4294967295,
        "preferred_life_time": 4294967295
      }
    ]
  },
  {
    "ifname": "enp3s0",
    "addr_info": []
  },
  {
    "ifname": "wlo1",
    "addr_info": [
      {
        "family": "inet",
        "local": "192.168.1.111",
        "prefixlen": 24,
        "broadcast": "192.168.1.255",
        "scope": "global",
        "dynamic": true,
        "noprefixroute": true,
        "label": "wlo1",
        "valid_life_time": 84461,
        "preferred_life_time": 84461
      },
      {
        "family": "inet6",
        "local": "fe80::b8fb:90e3:c17b:d3f8",
        "prefixlen": 64,
        "scope": "link",
        "noprefixroute": true,
        "valid_life_time": 4294967295,
        "preferred_life_time": 4294967295
      }
    ]
  }
]

Si l’on s’intéresse à la liste des adresses IP (v4 ou v6), il est probable que la boucle locale ne soit pas pertinente, on peut l’exclure simplement comme suit :

ip --json addr show |
jq '[ .[]
    | select( .ifname != "lo" )
    | select( .flags | index( "UP") )
    | { "ifname": .ifname, "addr_info": .addr_info }]'

Mieux encore, pour exclure la boucle locale il est possible de s’appuyer sur le champ flags :

ip --json addr show |
jq '[ .[]
    | select( .flags | index("LOOPBACK") | not )
    | select( .flags | index( "UP") )
    | { "ifname": .ifname, "addr_info": .addr_info }]'

Pour obtenir les adresses IPv4 de votre machine, on peut alors écrire :

ip -f inet --json addr show |
jq '[ .[]
    | select( .flags | index("LOOPBACK") | not )
    | select( .flags | index( "UP") )
    | { "ifname": .ifname, "ipv4": [ .addr_info[].local ] }]'

On a alors quelque chose comme suit :

[
  {
    "ifname": "enp3s0",
    "ipv4": [
      "192.168.1.43"
    ]
  },
  {
    "ifname": "wlo1",
    "ipv4": [
      "192.168.1.143"
    ]
  }
]

De même les adresses IPv6 s’obtiennent :

ip -f inet6 --json addr show |
jq '[ .[] | select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | { "ifname": .ifname, "ipv6": [ .addr_info[].local ] }]'

On notera que ces requêtes retournent des tableaux d’IP, car une interface peut être associé à plusieurs IP (en IPv4 comme en IPv6).

On pourra préférer une écriture du type :

ip -6 --json addr show |
jq '[ .[] | select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | { "ifname": .ifname, "ips": ( [ .addr_info[].local ] | join(",") ) }]'

qui ressemble à ça :

[
  {
    "ifname": "enp3s0",
    "ips": "2a01:e34:ec40:74f0:2d8:61ff:fe05:adfc,fe80::2d8:61ff:fe05:adfc"
  },
  {
    "ifname": "wlo1",
    "ips": "2a01:e34:ec40:74f0:c185:ab1c:2a83:24fb,2a01:e34:ec40:74f0:29a1:1d32:8799:51fd,fe80::9346:b2f:515b:cc0c"
  }
]

Qu'on peut reformater suivant vos besoins, comme :

ip -6 --json addr show |
jq '[ .[]
    | select( .flags | index("LOOPBACK") | not )
    | select( .flags | index( "UP") )
    | { "ifname": .ifname, "ips": ( [ .addr_info[].local ] | join(",") ) }]' |
jq -jr '.[] | .ifname, "@", .ips, "\n"'

qui donne :

enp3s0@2a01:e34:ec40:74f0:2d8:61ff:fe05:adfc,fe80::2d8:61ff:fe05:adfc
wlo1@2a01:e34:ec40:74f0:c185:ab1c:2a83:24fb,2a01:e34:ec40:74f0:29a1:1d32:8799:51fd,fe80::9346:b2f:515b:cc0c

Références

ᦿ


ℹ 2006 - 2020 | 🕸 Retour à l'accueil du domaine | 🏡 Retour à l'accueil du blog