Comment obtenir des informations sur la disponibilité d'une interface réseau?

8

J'ai une machine Ubuntu et une machine Debian.

Sur les deux, je veux pouvoir voir depuis combien de temps une interface réseau est connectée. (Autrement dit, connecté à un réseau obtenant une adresse IP, etc. Pas l'état physique d'un cabel). Disponibilité en secondes ou date + heure depuis le dernier changement ou quelque chose de similaire.

Pour l'instant, j'ai écrit un petit script pour faire la tâche, mais il semble qu'il devrait y avoir un moyen plus général de vérifier cela. Un programme ou quelque chose dans / proc ou autre.

Mon script:

#!/bin/bash

if [ -f /etc/os-release ]; then

    if TMP=$(grep -i 'ubuntu' /etc/os-release); then

        # we are on ubuntu
        for i in $(/bin/ls -1 /var/log/syslog* | sort -r); do
                TMP=$(zgrep '(eth0): device state change: ip-config -> activated' "$i" | tail -1 | sed "s/ "$(hostname)"/*/")
        done

        WHEN=$(echo "$TMP" | cut -f1 -d '*')
        SEC=$(echo "$(date +%s) - $(date -d "$WHEN" +%s)" | bc)
        echo "Last link up: $WHEN ($SEC seconds ago)."

    elif TMP=$(grep -i 'debian' /etc/os-release); then

        # we are on debian
        TMP=$(grep 'eth0: link up' /var/log/syslog* | tail -1 | cut -f2- -d':' | sed "s/ "$(uname -n)" kernel:/*/")
        WHEN=$(echo "$TMP" | cut -f1 -d '*')
        SEC=$(echo "$(date +%s) - $(date -d "$WHEN" +%s)" | bc)
        echo "Last link up: $WHEN ($SEC seconds ago)."

    fi

else
    echo "File /etc/os-release not found."
fi
Stefan Lithén
la source
1
Il n'y a rien de tel que «être connecté à un réseau» autre que d'avoir une connexion par câble physique. Le fait d'avoir une adresse IP attribuée à une carte réseau n'est pas un indicateur de l'état du réseau. Si vous souhaitez déterminer la connectivité réseau pour une carte réseau, vous devrez la surveiller activement (par exemple, en envoyant des pings périodiques à une autre cible ou en ayant une connexion TCP persistante).
Der Hochstapler
Hum, eh bien, lorsque mon routeur redémarre (prend environ 1 minute), mon NIC a son adresse IP supprimée, puis réaffectée à nouveau (byt NetworkManager). mon iMac fait quelque chose de similaire. Ce que je veux vraiment savoir, c'est quand le routeur a redémarré. Dans les journaux de mon iMac et de linux, je peux voir quand il a été réaffecté à nouveau, mais je suppose que sans quelque chose comme NetworkManager, son adresse IP serait toujours attribuée? Peut-être que je devrais plutôt regarder de plus près NetworkManager. Je vous remercie.
Stefan Lithén
1
Je suppose que NetworkManager (ou un autre composant) effectue une surveillance sur les connexions actives. Si une connexion est interrompue, elle détermine la disponibilité de votre passerelle (routeur), une fois qu'elle détecte qu'elle est hors service, elle peut libérer l'adresse IP attribuée via DHCP. Ou peut-être attend-il que la passerelle soit à nouveau disponible, puis demande que l'adresse IP soit réaffectée. Quoi qu'il en soit, cette question propose d'utiliser ip monitor(entre autres choses), cela pourrait valoir le coup d'oeil.
Der Hochstapler
1
Peut-être que placer un script /etc/dhcp3/dhclient-enter-hooks.d/pourrait également être une option. Mais je ne trouve pas suffisamment d'informations pour dire comment cela fonctionne exactement.
Der Hochstapler
Si votre routeur redémarre, vous voudrez peut-être voir quel effet il a sur le réseau. J'ai un NAS qui émet une série de bips lorsque j'en déconnecte le câble. À l'heure actuelle, il dispose d'un câble croisé le branchant sur un serveur. Si je redémarre le serveur, le NAS perd le lien et fait du bruit. D'après ce que vous décrivez, vous ne vous souciez pas vraiment des paquets IP, ni du fait qu'un câble est branché sur le port NIC de votre ordinateur, mais vous voulez en savoir plus sur la liaison. Cela peut être détecté à l'aide d'une technologie appelée Media Sense. (La fonction peut aussi souvent être appelée "État du support".) Essayez d'enregistrer les modifications.
TOOGAM

Réponses:

1

Le noyau Linux ne suit pas l'heure de démarrage d'une interface.

Au sein struct net_deviceil n'y a pas de champ qui contient une jiffiesvaleur quand une interface est lancée.

Le mieux que vous puissiez gérer est une méthode déduite des scripts et des journaux de l'espace utilisateur.

suprjami
la source
1

Sur ma machine dhclientest redémarré par NetworkManager lors de la reconnexion au réseau. Alors peut-être pouvez-vous utiliser l'heure de début du dhclientprocessus?

ps -o start,cmd $(pgrep dhclient)
hfs
la source
0

Voici ma variante (très similaire à la vôtre):

~ # expr $(echo $(date +%s) - $(date -d "`grep 'eth0: leased' /var/log/messages | tail -1 | awk '{print $1, $2, $3}'`" +%s))
1116
~ #

1116 - secondes après la location de l'IP.

septembre
la source
0

Cela devrait faire ce que vous voulez, en quelques secondes:

#!/bin/bash
STARTTIME=`date +%s`
GATEWAY=`ip r s | grep default | cut -d' ' -f3`
INTERVAL=1
while ping -c 1 -W 1 ${GATEWAY} >/dev/null 2>&1; 
do
  awk -v STIME="$STARTTIME" 'BEGIN {
   DTIME=systime()-STIME;
   printf "Seconds of uptime since %s: %d\n",
     strftime("%a %b %e %H:%M:%S %Z %Y",STIME),
     DTIME; }';
  sleep $INTERVAL;
done

echo "HOST DROPPED!"

Quelles sorties:

user@host $ sh test-script.sh
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 0
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 1
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 2
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 3
Seconds of uptime since Sat Nov 15 01:14:26 EST 2014: 4
HOST DROPPED!

Théorie: Obtenez un horodatage STARTTIME, puis testez chaque fois INTERVALsi la passerelle (via ip route show) est toujours active, si c'est le cas, soustrayez l'horodatage actuel de l'original et imprimez. Sinon, quittez et indiquez que l'hôte a interrompu sa connexion. Voir les pages de manuel pour une explication de chacune des options de commande. Si vous ne voulez pas de sortie toutes les secondes, augmentez INTERVAL.

glallen
la source