cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, sciences et coups de gueule…]

Menu
đŸ˜€ Ce billet a Ă©tĂ© Ă©ditĂ© le : 2024-02-09

« 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 'map( .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 'map( select( .flags | index( "UP") ) | { "ifname": .ifname } )'

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

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

qu'il est possible d'Ă©crire de simplifier ainsi :

ip --json addr show |
  jq 'map( select( .flags | index( "UP") ) | { ifname, 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 '
map(
  select( .ifname != "lo" ) |
  select( .flags | index( "UP") ) |
  { ifname, addr_info }
)'

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

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

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

ip -f inet --json addr show | jq '
map(
  select( .flags | index("LOOPBACK") | not ) |
  select( .flags | index( "UP") ) |
  { 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 'map( select( .flags | index("LOOPBACK") | not ) | select( .flags | index( "UP") ) | { 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 'map( 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 'map(
    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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog