Comment puis-je vérifier de manière fiable quelle est la dernière fois qu'une machine Ubuntu a été connectée à Internet?
Dans le cas contraire, un moyen de vérifier la dernière connexion d’une machine Ubuntu à un réseau serait suffisant.
Méthode 1
Même si NetworkManager.conf autorise la journalisation, cela va apparemment toujours dans syslog. Cependant, kern.log l'a également.
grep 'associated' /var/log/kern.log | tail -n1
Jun 21 17:08:25 anaconda kernel: [ 4910.819781] wlan1: associated
Méthode 2
J'ai constaté que NetworkManager stocke la dernière heure de connexion et qu'il est trié dans le fichier /var/lib/NetworkManager/timestamps
, au format d'heure unix (secondes depuis 1970). Le mien ressemble à ceci par exemple:
$ cat /var/lib/NetworkManager/timestamps
[timestamps]
c562ac2d-8911-4273-b165-ed1495b28c9a=1432777079
46cfcdd9-d095-418f-acd6-0a7ca282bb9a=0
d81fb3d0-1717-42c0-903d-4622c2381597=1434895707
b0bdefe6-df88-49bb-83d8-154dd21d77d9=1433093286
Pour afficher la dernière entrée
date --date=@"$( awk -F'=' 'BEGIN {var=0}{if(var<$2) var=$2;} END{print var}' /var/lib/NetworkManager/timestamps )"
Awk recherchera la plus grande période d’époque (en d’autres termes la plus récente) et la date la convertira en une forme lisible par l’homme.
Je soupçonne également que ce fichier (/var/lib/NetworkManager/timestamps
) est utilisé par le menu graphique Editer les connexions pour afficher la dernière connexion
Le problème est que si vous êtes toujours connecté à un point d'accès, l'interface graphique continue d'afficher now
pas, l'heure à laquelle la connexion a été établie pour la dernière fois.
Vous pouvez vérifier le fichier /var/log/syslog
il affichera la dernière fois que vous vous êtes connecté à un réseau.
Exemple
Jun 21 08:00:00 Ubuntu dhclient: DHCPREQUEST of 192.0.0.0 on wlan0 to 192.0.0.0 port 67 (xid=0xec7c6e7)
Vous pouvez exécuter une commande grep pour extraire uniquement ce dont vous avez besoin du journal
< /var/log/syslog grep DHCPREQUEST
Vérifiez CONNECTED_GLOBAL
après avoir trouvé link connected
dans /var/log/syslog
/link connected/,/CONNECTED_GLOBAL/
% awk '/link connected/,/CONNECTED_GLOBAL/ {line=$0} END{print line}' /var/log/syslog
Jun 21 11:12:54 sturm NetworkManager[736]: <info> NetworkManager state is now CONNECTED_GLOBAL Jun 21 11:12:54
% awk '/link connected/,/CONNECTED_GLOBAL/ {month=$1;day=$2;time=$3} END{print month,day,time}' /var/log/syslog
Jun 21 11:12:54
Une façon de vérifier n’importe quel journal de service/démon relayé sur Internet pour fonctionner. Par exemple, NTP (mises à jour réseau).
Voir dpkg -L ntpdate
pour les points d'ancrage du réseau
Bien que j’ai vérifié son journal pour le bureau Ubuntu, sa mise à jour s’exécute chaque fois que le réseau est en place et continue d’essayer après un court délai si la dernière mise à jour a échoué. Il connecte ntp.ubuntu.com
.
(Remarque, j'ai ajouté la première colonne dans la sortie pour mes commentaires)
$ grep -r ntpdate /var/log/syslog*
1st_trial Jul 14 00:35:56 user-VirtualBox ntpdate[774]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 14 00:35:56 user-VirtualBox ntpdate[774]: no servers can be used, exiting
2nd_trial Jul 14 03:38:57 user-VirtualBox ntpdate[2571]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 14 03:38:57 user-VirtualBox ntpdate[2571]: no servers can be used, exiting
3rd_trial Jul 14 03:46:09 user-VirtualBox ntpdate[2782]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 14 03:46:09 user-VirtualBox ntpdate[2782]: no servers can be used, exiting
4th_trial Jul 14 03:47:48 user-VirtualBox ntpdate[2917]: step time server 91.189.89.199 offset 3.458355 sec
1st_trial Jul 14 10:23:07 user-VirtualBox ntpdate[728]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 14 10:23:07 user-VirtualBox ntpdate[728]: no servers can be used, exiting
2nd_trial Jul 14 10:37:22 user-VirtualBox ntpdate[2099]: step time server 91.189.89.199 offset 2.021103 sec
dis-/re-con Jul 14 15:27:09 user-VirtualBox ntpdate[20174]: step time server 91.189.89.199 offset 1.677465 sec
1st_trial Jul 14 23:55:00 user-VirtualBox ntpdate[807]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 14 23:55:00 user-VirtualBox ntpdate[807]: no servers can be used, exiting
2nd_trial Jul 15 00:00:24 user-VirtualBox ntpdate[2041]: step time server 91.189.94.4 offset 1.619839 sec
1st_trial Jul 15 05:39:08 user-VirtualBox ntpdate[767]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 15 05:39:08 user-VirtualBox ntpdate[767]: no servers can be used, exiting
2nd_trial Jul 15 05:39:21 user-VirtualBox ntpdate[1088]: step time server 91.189.94.4 offset 2.897077 sec
1st_trial Jul 15 05:49:40 user-VirtualBox ntpdate[787]: Can't find Host ntp.ubuntu.com: Name or service not known (-2)
Jul 15 05:49:40 user-VirtualBox ntpdate[787]: no servers can be used, exiting
2nd_trial Jul 15 05:49:50 user-VirtualBox ntpdate[1101]: adjust time server 91.189.94.4 offset 0.090520 sec
reconnect Jul 15 05:55:50 user-VirtualBox ntpdate[2251]: adjust time server 91.189.94.4 offset 0.261432 sec
reconnect Jul 15 06:04:53 user-VirtualBox ntpdate[2702]: step time server 91.189.94.4 offset 0.525658 sec
Je confirme qu'il est installé par défaut pour les éditions de bureau et de serveur Ubuntu 14.04 LTS 64Bit.
Je l'ai essayé dans VM, il montre seulement le temps qu'il s'est connecté ou reconnecté (avec Internet disponible). Pas ce que vous voulez (la dernière fois était connecté)
Remarque: syslog est un journal de rotation. Si vous souhaitez rechercher dans tous les journaux, même les anciens, ceux compressés, utilisez zgrep
.
zgrep -ih ntpdate /var/log/syslog* | sort -bn -k2
Si vous ne trouvez pas la "bonne" façon de le faire, vous pouvez toujours fabriquer le vôtre!
La fonction bash suivante vous dira si vous êtes en ligne (sur Internet) ou non.
Il vous suffira d'écrire un script qui l'appellera (dans une boucle puis se mettra en veille) et enregistrera la date et l'heure du dernier jour dans un fichier (écrasant, de sorte qu'il ne possède que la dernière valeur).
Vous devez ajouter du code à la boucle pour qu'elle vérifie dès son appel initial et enregistre (donc votre état initial est défini correctement).
Après cela, vous ne vous reconnecterez que lorsque l'état se déconnectera pour la première fois et lorsqu'il le sera pour la première fois après l'avoir été. Il est plus facile de coder que d'expliquer. ;)
Cela serait limité en précision par la longueur du délai (veille) que vous utilisez dans la boucle (pour l'empêcher d'être une boucle très serrée susceptible de consommer trop de ressources système). Elle ignorait également tout ce qui se passait avant son démarrage. ou quand il ne fonctionne pas.
Le script lui-même peut être démarré (en tant que tâche en arrière-plan (&
à la fin de l'appel), éventuellement avec un Nohup
pour le maintenir en cours si son processus parent se termine) lorsque votre utilisateur se connecte en exécutant à partir de votre fichier $ HOME/.profile, en le démarrant avec votre utilitaire de démarrage automatique du bureau (KDE ou Gnome), à partir d'un travail cron qui vérifie périodiquement s'il n'est pas déjà en cours, ou même à partir de votre système de démarrage (init/systemd/etc., si vous en savez assez pour le faire.)
Lorsque vous ne pouvez pas trouver quelque chose comme cela qui fait exactement ce que vous voulez, il n'est souvent pas trop difficile d'écrire votre propre script pour le faire et l'exécuter comme un démon en arrière-plan.
Il est préférable de l'exécuter à partir d'un compte utilisateur ordinaire, si possible - à moins que vous ne le codiez dans un langage robuste tel que C ou Python -, car les scripts Shell exécutés avec des privilèges racine posent souvent des risques de sécurité.
Cette approche a un autre problème. Parfois, un ping expire vous donnant un faux statut hors connexion.
J'ai un script complet, offline_alert , qui fait plutôt le contraire de ce que vous voulez - m'avertit lorsque je passe hors ligne - mais le code peut s'avérer utile. Il a une meilleure fonction hors connexion qui tente de réduire les faux positifs des délais d'attente de ping.
function offline {
## Test if offline
## Returns 0 if online, 2 if offline
local RC
ping -c 1 google.com > /dev/null 2>&1
RC=$?
##echo "offline returning [${RC}]"
return $RC
}