Forum Programmation.shell Récupérer les infos réseau

Posté par  .
Étiquettes : aucune
0
3
août
2007
Bonjour,

J'ai un petit concours bash.

Récupérer à l'aide d'un script de manière la plus élégante, la plus fiable, et la plus portable les paramètre de configuration de la pile TCP/IP Linux.

Je me lance, mais c'est pas très joli:

IP=`ifconfig | egrep 'inet add?r:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`

MASK=`ifconfig | egrep 'inet add?r:'| grep "$IP" | cut -d: -f4`

GATEWAY=`route -n | egrep "^0.0.0.0 +[[:digit:].]+ +0.0.0.0" | awk '{print $2}'`

DNS=`grep nameserver /etc/resolv.conf | head -1 | awk '{print $2}'`


Merci pour votre aide.
  • # Cleaner

    Posté par  . Évalué à 1.

    allez je m'y mets:
    IP= $(ifconfig | awk -F ":" '/inet addr/ {print $2 }' | cut -d " " -f1);

    Pour te mettre sur la voie.

    @+ et bonne chance
    • [^] # Re: Cleaner

      Posté par  . Évalué à 3.

      Tant qu'à faire autant tout faire en awk : tu économises une creation de process supplémentaire :

      ifconfig | awk -F ":" '/inet addr/ {print substr($2,0, index($2," ")) }'
    • [^] # Re: Cleaner

      Posté par  . Évalué à 2.

      Avec l'economie d'une creation de process superflue :

      ifconfig | awk -F ":" '/inet addr/ {print substr($2,0, index($2," ")) }'
    • [^] # Re: Cleaner

      Posté par  (site web personnel) . Évalué à 1.

      Attention, sur la machine où je suis, c'est : inet adr et pas inet addr (debian etch fraichement installée)

      Du coup ça ne marche pas.
  • # wikisys

    Posté par  . Évalué à 3.

    Pour le concours :
    ip=$( ifconfig | grep -v '127\.0\.0\.1' | sed -n 's/.*adr:\([^ ]*\) .*/\1/p' )
    
    Sinon j'ai fait un chti script qui a pour but de convertir la config réseau de mes serveurs Linux en syntaxe wiki, le résultat est ensuite posté dans dokuwiki. C'est pas super élégant, ça à l'air fiable, et sûrement pas portable (tant qu'on a pas testé...). Exemple de résultat :
    ^ Interface ^ MAC ^ IP ^ Masque ^ Network ^
    | eth1 | 00:0E:35:70:AA:31 | 192.168.0.2 | 255.255.255.0 | 192.168.0.0/24 |
    | lo | ? | 127.0.0.1 | 255.0.0.0 | 127.0.0.0/8 |
    
    Le script :
    export LANG=C
    
    # Table header
    echo "^ Interface ^ MAC ^ IP ^ Masque ^ Network ^"
    
    # Parse ifconfig with awk, results one line per interface
    ifconfig | awk -F " *" '
    
    # Each interface definition ends with an empty line,
    # even the last one. When an empty line is found we
    # print the results.
    $0 == "" {
      print iface" "mac" "ip" "masque
      iface = mac = ip = masque = "?"
      next
    }
    
    # Get interesting values
    $1 !~ /^ *$/   { iface = $1 }
    $2 ~ /^inet$/  { split( $3, a_res, ":" ); ip     = a_res[2] }
    $4 ~ /^Mask:/  { split( $4, a_res, ":" ); masque = a_res[2] }
    $5 ~ /^Mask:/  { split( $5, a_res, ":" ); masque = a_res[2] }
    $4 == "HWaddr" { mac = $5 }
    
    ' | while read iface mac ip masque
    do
      # ipcalc gets network address and CIDR notation
      net=$( ipcalc -bn $ip"/"$masque | awk -F " *" '/Network:/ { print $2 }' )
    
      # print each line
      echo '| '$iface' | '$mac' | '$ip' | '$masque' | '$net' |'
    done
    
    Et Pour mettre en forme les routes de la manière suivante :
    ^ Iface ^ Destination ^ Genmask ^ Gateway ^ 
    | eth1 | 192.168.0.0 | 255.255.255.0 | 0.0.0.0 |
    | eth1 | 0.0.0.0 | 0.0.0.0 | 192.168.0.254 |
    
    J'utilise :
    LANG=C route -n | awk -F " *" '
    
    NR == 2 { print "^ "$8" ^ "$1" ^ "$3" ^ "$2" ^ "; next }
    
    NR >=3 { print "| "$8" | "$1" | "$3" | "$2" |" }
    
    '
    
  • # Attention à la gateway

    Posté par  (site web personnel) . Évalué à 1.

    Il peut arriver qu'une machine n'ait pas de route par défaut vers une passerelle précise, mais simplement via une interface.

    Par exemple :
    $ /sbin/route -n | egrep "^0.0.0.0 +[[:digit:].]+ +0.0.0.0" | awk '{print $2}'
    0.0.0.0
    $ ip route | grep default
    default dev ppp0 scope link

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.