web-dev-qa-db-fra.com

La manière «appropriée» d'obtenir SEULEMENT mon masque de réseau eth0 via CLI dans Ubuntu 18.04 sur VPS?

Selon cette réponse et de nombreux autres tutoriels sur le Web, ifconfig énumérera de nombreuses informations fascinantes et utiles. Et, cela semble être le moyen standard pour découvrir des choses comme mon masque de réseau.

Mais, pour le script, j'ai besoin seulement du masque de réseau lui-même pour eth0; et man ifconfig n'aidait pas cette question.

J'utilise un VPS, donc je n'ai pas le contrôle de mon masque de réseau; J'ai besoin de trouver ce à quoi il a été configuré.

(Remarque: Bien que j'ai besoin de eth0, certaines machines peuvent en avoir une autre, par exemple eth1 ou ens3, ce qui serait également utile.)

  • Je n'a pas besoin de toute la ligne dans laquelle se trouve le masque de réseau:

inet 111.222.333.444 netmask 255.255.255.0 broadcast 111.222.555.666

  • I want to avoid a "hackdoor" method, like getting netmask 255.255.255.0 then running sed "s/netmask //" because stuff can change—unless an expert says so
2
Jesse Steele

C’est probablement ce dont vous avez besoin (notez que cela ne fonctionnera pas sous Ubuntu 16.04):

_#!/bin/bash
IFACE='eth0'
ifconfig | grep -A 7 "$IFACE" | sed -nr 's/^.*netmask\s([0-9\.]+)\s\sbroadcast.*$/\1/p'
_

Sur la première ligne, le nom de l'interface réseau est attribué à la valeur de la variable _$IFACE_. Cette fonction est utile pour les scripts. Sinon, vous pouvez utiliser _grep -A 7 'eth0'_.

Sur la deuxième ligne, la sortie de la commande ifconfig sera acheminée vers la commande grep, où l'option _-A 7_ générera les 7 lignes suivantes après la ligne avec la chaîne/regexp correspondante. La sortie de cette commande sera transmise à sed.

Dans la commande sed:

  • l'expression régulière ^.*netmask\s(.*)\s\sbroadcast.*$ correspondra à la ligne entière, du début _^_ à la fin _$_, qui contient des caractères _.*_ et les "mots-clés" netmask\space, [0-9\.]+ et \s\sbroadcast dans cet ordre exact;

  • cette ligne sera remplacée (_s/old/new/_) par le contenu du premier groupe de capture [_(.*)_-> _\1_], où l'expression rationnelle _[0-9\.]+_ correspond aux chaînes qui sont composé de points d'extrémité de chiffres;

  • l'option _-r_ (ou _-E_) activera les expressions régulières étendues, ce qui, dans ce cas, nous permettra d'utiliser les parenthèses rondes librement;

  • l'option _-n_ avec la combinaison de l'indicateur p avec uniquement la ligne correspondante et conserve le résultat restant de sed.


Voici un exemple étendu qui analysera les noms de toutes les interfaces réseau et fera la même chose que la commande ci-dessus pour chacune d’elles:

_for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do \
    echo -en "${IFACE}:\t"; ifconfig | \
    grep -A 7 "$IFACE" | \
    sed 's/  broadcast.*$//' | \
    sed -rn 's/^.*netmask (.*)$/\1/p'; \
done
_

Exemple de sortie de la commande ci-dessus exécutée sur une machine virtuelle avec Ubuntu 18.04:

_$ for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do echo -en "${IFACE}:\t"; ifconfig | grep -A 7 "$IFACE" | sed 's/..broadcast.*$//' | sed -rn 's/^.*netmask (.*)$/\1/p'; done
ens33:  255.255.255.0
lo:     255.0.0.0
_
2
pa4080