Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/03/2014, à 17:27

Hazender

récupérer les noms des connectés depuis un fichier log

Salut tout le monde j'écris actuellement un script de service pour un serveur de jeux et j'aimerais via une commande affiché le nom des connecté au serveur
Le seul moyen que j'ai trouvé est de recherché dans le fichier log ou à chaque connections/déconnections est inscrit :

Info: UniverseServer: Client 'User1' <1> (80.185.xxx.xx:xxxxx) connected
Info: UniverseServer: Client 'User1' <1> (80.185.xxx.xx:xxxxx) disconnected

Je n'est mis ici que les lignes du log qui m'intéresse.
A l'aide d'une commande sed j'arrive à récupérer le nom de l'utilisateur mais pas à le supprimer lorsque se même utilisateur se deco et je ne trouve pas comment faire... ma commande :

#!/bin/bash

.players () {
variable=$(sed -rn "s/^\s*Info: UniverseServer: Client\s*\s*'(.*)'.*$/\1/p" MonFichierLog)
echo -e "${variable}"
}

case "$1" in

     .players)
          .players
     ;;

esac

Je me retrouve donc avec le nom qui s' affiche pour chaque connexion déconnexion et non pas avec juste le nom des joueurs connecter.

A savoir le fichier log est vidé chaque fois que l'on coupe le serveur de jeux.

Pouvez vous m'aider ?

Merci d'avance.

Dernière modification par Hazender (Le 15/03/2014, à 17:42)

Hors ligne

#2 Le 15/03/2014, à 18:15

pingouinux

Re : récupérer les noms des connectés depuis un fichier log

Bonjour,
Peut-être ceci, si j'ai bien compris :

.players () {
   while read user
   do
      n_connect=$(grep -c "\s*'$user'.*\bconnected" MonFichierLog)
      n_disconn=$(grep -c "\s*'$user'.*\bdisconnected" MonFichierLog)
      (( n_connect>n_disconn )) && echo "$user"
   done < <(sed -rn "s/^\s*Info: UniverseServer: Client\s*'(.*)'.*\bconnected.*$/\1/p" MonFichierLog|sort -u)
}

Hors ligne

#3 Le 15/03/2014, à 20:35

Hazender

Re : récupérer les noms des connectés depuis un fichier log

Alors la je suis abasourdi réponse rapide efficace qui marche tout de suite et fais exactement ce que je veux oO
Bon en revanche je ne suis pas sur de tout comprendre tu recherche en 1er lieu avec un do pour recherché au moins une fois les connected et les disconnected pour un même nom d'utilisateur et tu compare si il y a plus de connected ça signifie que l'utilisateur est connecté ?

Je te remercie énormément et si tu as le temps si sur la même ligne je voulais l'ip de l'utilisateur ?

Dernière modification par Hazender (Le 15/03/2014, à 20:36)

Hors ligne

#4 Le 15/03/2014, à 21:12

pingouinux

Re : récupérer les noms des connectés depuis un fichier log

Je suppose qu'un "user" a toujours la même "ip". Voici déjà la commande modifiée. Si tu as besoin d'explications, je les donnerai plus tard.

.players () {
   while read user ip
   do
      n_connect=$(grep -c "\s*'$user'.*\bconnected" MonFichierLog)
      n_disconn=$(grep -c "\s*'$user'.*\bdisconnected" MonFichierLog)
      (( n_connect>n_disconn )) && echo "$user $ip"
   done < <(sed -rn "s/^\s*Info: UniverseServer: Client\s*'(.*)'.*(\([^)]+\))\s*connected.*$/\1 \2/p" MonFichierLog|sort -u)
}

Dernière modification par pingouinux (Le 23/03/2014, à 16:30)

Hors ligne

#5 Le 15/03/2014, à 21:32

Hazender

Re : récupérer les noms des connectés depuis un fichier log

Effectivement l'ip est changent le port de connection n'est jamais le même je me retrouve donc avec des listes de doublon et dans le cas d'un joueur nomade ça vas poser des problèmes.
Je me contenterais donc du nom seul .
Et j'accepterais volontiers une explication si tu as le temps.

Merci pour ton aide et ta réactivité smile

Hors ligne

#6 Le 15/03/2014, à 21:44

pingouinux

Re : récupérer les noms des connectés depuis un fichier log

Explications :

La boucle

while read user ip
do
done < <(sed .....)

lit la sortie de la commande

sed -rn "s/^\s*Info: UniverseServer: Client\s*'(.*)'.*(\([^)]+\))\s*connected.*$/\1 \2/p" MonFichierLog | sort -u

qui recherche user+ip pour toutes les connexions, suivi d'un tri pour éliminer les doublons.
On ne liste un couple user+ip que si le nombre de connexions est supérieur au nombre de déconnexions.

Peux-tu donner un exemple de ce que tu voudrais pour lister les IP (petit fichier MonFichierLog + résultat souhaité) ?

Hors ligne

#7 Le 15/03/2014, à 22:05

Hazender

Re : récupérer les noms des connectés depuis un fichier log

merci pour la petite explication.
en fait lors d'une connexion suivis de la déconnexion l'ip ne change pas mais lors d'une connexion suivante le port change je me retrouve donc avec

$ service monservice .players
Meatliver (80.185.xxx.xx:162)
Meatliver (80.185.xxx.xx:165)
Meatliver (80.185.xxx.xx:52058)
Meatliver (80.185.xxx.xx:52078)
Meatliver (80.185.xxx.xx:52150)

donc peut être filtré l'ip et stopper le filtre au double point ":"
par contre dans le cas ou le serveur n'est pas redémarrer depuis longtemps et ou un utilisateur se connecte depuis un autre endroit l'ip vas aussi changer et il me semble que sa serais bien plus compliqué de ne prendre en conte que la dernière ip trouvé pour l'utilisateur.
donc ne te casse pas la tête trop longtemps sur le dernier cas qui est exceptionnelle vue que le serveur fais un reboot auto tout les 2 jours tongue

plus explicite sans les doublons et sans le port de connexion:

$ service monservice .players
Meatliver (80.185.xxx.xx)

par contre si j'envisage de faire un teste : si il n'y as pas d'utilisateur de connecté retourné un message, la je bloque car la boucle s'exécute surement toujours une dernière fois et retourne donc toujours en dernier une valeur vide pour user

	if [ $user = "" ]; then
		echo -e "mon message"
	fi

Dernière modification par Hazender (Le 15/03/2014, à 22:08)

Hors ligne

#8 Le 15/03/2014, à 22:10

Hazender

Re : récupérer les noms des connectés depuis un fichier log

je suis désolé je débute et j'ai l'impression que tu fais tout pour moi hmm

Hors ligne

#9 Le 15/03/2014, à 22:32

pingouinux

Re : récupérer les noms des connectés depuis un fichier log

Je ne peux tester que si tu me donnes les lignes complètes de MonFichierLog.
Pour ne pas tenir compte du n° de port :

.players () {
   n=0
   while read user ip
   do
      n_connect=$(grep -c "\s*'$user'.*\bconnected" MonFichierLog)
      n_disconn=$(grep -c "\s*'$user'.*\bdisconnected" MonFichierLog)
      (( n_connect>n_disconn )) && { echo "$user $ip"; ((n++)); }
   done < <(sed -rn "s/^\s*Info: UniverseServer: Client\s*'(.*)'.*(\([^):]+):.+\)\s*connected.*$/\1 \2)/p" MonFichierLog|sort -u)

   ((n)) || echo "mon message"
}

La boucle ne s'exécute que s'il y a des utilisateurs.

Hors ligne

#10 Le 15/03/2014, à 22:44

Hazender

Re : récupérer les noms des connectés depuis un fichier log

voila une partie du .log

Warn: UniverseServer: Logged in account  as player Meatliver
Info: UniverseServer: Loading ship world received from client <User: Meatliver>
Warn: Recovering SimpleDatabase at device: <unnamed temp file>
Warn: Recovery finished
Info: UniverseServer: Client 'Meatliver' <1> (80.185.187.56:52078) connected
Info: UniverseServer: Loading world db for world alpha:-99365234:73205574:-8762603:1 
Info: UniverseServer: Shutting down world alpha:-99365234:73205574:-8762603:1 due to inactivity
Info: accept from 89.156.40.21:60944 (9)
Info: UniverseServer: Connection received from: 89.156.40.21:60944
Info: UniverseServer: client connection made from 89.156.40.21:60944
Info: UniverseServer: Assets digest check is disabled during client connect
Info: UniverseServer: Sending Handshake Challenge
Warn: UniverseServer: Logged in account  as player Ducknerfer
Info: UniverseServer: Client 'Ducknerfer' <2> (89.156.40.21:60944) connected
Info: UniverseServer: Loading world db for world alpha:1997497:-62498552:3147554:7:1 
Info: UniverseServer: Shutting down ship world for client 'Meatliver' <1> (80.185.187.56:52078)
Info: UniverseServer: Client 'Meatliver' <1> (80.185.187.56:52078) disconnected
Info: closing 80.185.187.56:52078 (12)
Info: NetSocket read loop shut down: Connection reset by peer 80.185.187.56:52078 (0)
Info: accept from 80.185.187.56:52150 (14)
Info: UniverseServer: Connection received from: 80.185.187.56:52150
Info: UniverseServer: client connection made from 80.185.187.56:52150
Info: UniverseServer: Assets digest check is disabled during client connect
Info: UniverseServer: Sending Handshake Challenge
Warn: UniverseServer: Logged in account  as player Meatliver
Info: UniverseServer: Loading ship world received from client <User: Meatliver>
Warn: Recovering SimpleDatabase at device: <unnamed temp file>
Warn: Recovery finished
Info: UniverseServer: Client 'Meatliver' <1> (80.185.187.56:52150) connected
Info: UniverseServer: Loading world db for world alpha:-99365234:73205574:-8762603:1 
Info: UniverseServer: Shutting down world alpha:1997497:-62498552:3147554:7:1 due to inactivity
Info: UniverseServer: Shutting down world alpha:-99365234:73205574:-8762603:1 due to inactivity
Info: UniverseServer: Loading world db for world alpha:1997497:-62498552:3147554:7:1 
Info: UniverseServer: Shutting down ship world for client 'Ducknerfer' <2> (89.156.40.21:60944)
Info: UniverseServer: Client 'Ducknerfer' <2> (89.156.40.21:60944) disconnected
Info: closing 89.156.40.21:60944 (9)
Info: NetSocket read loop shut down: Connection reset by peer 89.156.40.21:60944 (0)
Info: UniverseServer: Shutting down world alpha:1997497:-62498552:3147554:7:1 due to inactivity
Info: accept from 109.130.68.238:52210 (12)
Info: UniverseServer: Connection received from: 109.130.68.238:52210
Info: UniverseServer: client connection made from 109.130.68.238:52210
Info: UniverseServer: Assets digest check is disabled during client connect
Info: UniverseServer: Sending Handshake Challenge
Warn: UniverseServer: Logged in account  as player Bot Ato
Info: UniverseServer: Loading ship world received from client <User: Bot Ato>
Warn: Recovering SimpleDatabase at device: <unnamed temp file>
Warn: Recovery finished
Info: UniverseServer: Client 'Bot Ato' <3> (109.130.68.238:52210) connected
Info: UniverseServer: Loading world db for world alpha:1997497:-62498552:3147554:7:1 
Info: UniverseServer: Shutting down ship world for client 'Meatliver' <1> (80.185.187.56:52150)
Info: UniverseServer: Client 'Meatliver' <1> (80.185.187.56:52150) disconnected
Info: closing 80.185.187.56:52150 (14)
Info: NetSocket read loop shut down: Connection reset by peer 80.185.187.56:52150 (0)
Info: UniverseServer: Shutting down world alpha:1997497:-62498552:3147554:7:1 due to inactivity
Info: UniverseServer: Loading world db for world alpha:1997497:-62498552:3147554:7:1 
Info: accept from 80.185.187.56:52720 (9)
Info: UniverseServer: Connection received from: 80.185.187.56:52720
Info: UniverseServer: client connection made from 80.185.187.56:52720
Info: UniverseServer: Assets digest check is disabled during client connect
Info: UniverseServer: Sending Handshake Challenge
Warn: UniverseServer: Logged in account  as player Haz
Info: UniverseServer: Client 'Haz' <1> (80.185.187.56:52720) connected
Info:  <Bot Ato> parle dans le chat
Info: UniverseServer: Shutting down world alpha:1997497:-62498552:3147554:7:1 due to inactivity
Info: UniverseServer: Loading world db for world alpha:1997497:-62498552:3147554:7:1 
Info: UniverseServer: Shutting down world alpha:1997497:-62498552:3147554:7:1 due to inactivity
Info: UniverseServer: Client 'Bot Ato' <3> (109.130.68.238:52210) disconnected
Info: UniverseServer: Client 'Bot Ato' <3> (109.130.68.235:52210) connected

avec a la fin un utilisateur qui change d'ip entre deux connexion

Hors ligne

#11 Le 15/03/2014, à 22:52

Hazender

Re : récupérer les noms des connectés depuis un fichier log

tien je viens de remarqué j'ai un utilisateur avec un nom ou ou il y a des espaces il est invisible pour le code

Hors ligne

#12 Le 15/03/2014, à 23:09

pingouinux

Re : récupérer les noms des connectés depuis un fichier log

je viens de remarqué j'ai un utilisateur avec un nom ou ou il y a des espaces il est invisible pour le code

Ce n'était pas prévu, mais c'est corrigé.

fic=MonFichierLog
.players () {
   n=0
   while IFS=, read user ip
   do
      n_connect=$(grep -c "\s*'$user'.*($ip:.\+)\s*connected" "$fic")
      n_disconn=$(grep -c "\s*'$user'.*($ip:.\+)\s*disconnected" "$fic")
      (( n_connect>n_disconn )) && { echo "$user ($ip)"; ((n++)); }
   done < <(sed -rn "s/^\s*Info: UniverseServer: Client\s*'(.*)'.*\(([^):]+):.+\)\s*connected.*$/\1,\2/p" "$fic"|sort -u)

   ((n)) || echo "mon message"
}

Ajouté :
Voici le résultat avec ton exemple :

Bot Ato (109.130.68.235)
Haz (80.185.187.56)

Dernière modification par pingouinux (Le 15/03/2014, à 23:12)

Hors ligne

#13 Le 15/03/2014, à 23:33

Hazender

Re : récupérer les noms des connectés depuis un fichier log

ton code marche du tonner merci beaucoup smile il fais tout et même plus que se que j'espérais

Hors ligne