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 10/01/2010, à 14:06

Blabla404

[Résolu][script] Savoir qui est loggé où. ssh+users+w

Bonjour,

Je cherche à faire un script me permettant de savoir sur un ensemble de machine qui est connecté sur quelle machine.
L'idée est de m'éviter de devoir faire toutes les salles info quand je cherche quelqu'un.

édit: Voici le script final, à appeler avec en argument la personne cherchée. Ici les machines s'appellent MACHINE-01 jusqu'à MACHINE-42.

#!/bin/bash

for i in $(seq -f '%02g' 1 42)
do
    ssh MACHINE-$i w -s | egrep -q "^$1[[:blank:]]*tty7" &&  echo trouvé sur MACHINE-$i &
done

wait
exit 0

et si on veut connaitre toutes les personnes de la salle:

#!/bin/bash

function pqui {
users=$(ssh MACHINE-$1 users)
result=""
for user in $users
  do
    ssh MACHINE-$1 w -s | egrep -q "$user[[:blank:]]*tty7" && result=$result"$user "
  done
if [[ ! -z $result ]]
  then
    echo "MACHINE-$1: "$result
  fi
}

for i in $(seq -f '%02g' 1 $NBPC);
  do
    pqui $i &
  done
wait
exit 0;

Suite de mon premier message:
Je n'y connais rien en bash donc ce que j'ai fait est peut être moche. Voila ce que j'ai pour le moment.

#!/bin/sh
for i in $(seq 1 1 9);
do
echo MACHINE-0$i $(ssh MACHINE-0$i users) &
done

for i in $(seq 10 1 42);
do
echo MACHINE-$i $(ssh MACHINE-$i users) &
done

exit 0;

J'ai plusieurs problèmes.
- Comment faire une unique boucle allant de 01 à 42 ? (pour le moment je vais de 1 à 9 en ajoutant des zéros puis de 10 à 42)
- Comment savoir si un utilisateur est connecté physiquement ? (si je me déplace et qu'il n'y a personne mon script n'a pas d'intérêt)
- Comment ne rien afficher si personne n'est sur la machine ?

Pour les 2 derniers points je n'ai rien trouvé en lisant le man users. En gros users utilise /var/run/utmp mais ce fichier est illisible.

Merci d'avance.

Dernière modification par redoxx (Le 10/01/2010, à 17:50)

Hors ligne

#2 Le 10/01/2010, à 14:46

nesthib

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

pour la boucle :

for (( i=1 ; i<=42 ; i++ ))
do
  echo MACHINE$(printf "%02d\n" "$i")
done

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 10/01/2010, à 15:10

Blabla404

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

Merci je ne savais pas que printf marchait aussi en sh.
Par contre pour le for ça ne marche pas avec le shell sh. Du coup je garde le seq.
Reste à trouver comment savoir si la connexion est physique et ne rien afficher si il n'y a personne.

Hors ligne

#4 Le 10/01/2010, à 15:18

tiky

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

Bonjour,

Comment faire une unique boucle allant de 01 à 42 ?

for i in $(seq -f '%02g' 1 42);

Comment savoir si un utilisateur est connecté physiquement ?

Je te conseille d'utiliser la commande finger de BSD.

sudo apt-get install bsd-finger

Il faudra évidemment l'installer sur chaque machine mais tu peux le faire avec une commande par ssh en combinant apt-get, yes et une petite boucle for ;).

for user in $(ssh MACHINE-0$i users)
do
$result=$(finger -s $user)
...

Comment ne rien afficher si personne n'est sur la machine ?

result=$(ssh MACHINE-0$i users)
if [[ ! -z $result ]]
  then echo $result
fi

[[]] est un raccourci pour appeler la commande test. Je t'invite à lire la documentation de cette commande : man test.

Finalement, le code devrait ressembler à ceci :

for i in $(seq -f '%02g' 1 42)
do
   users=$(ssh MACHINE-0$i users)
   for user in $users
   do
      result=$(finger -s $user)

   done
done

Il faut utiliser la commande awk et grep pour parser le résultat retourné par finger.

EDIT: J'ai trouvé mieux que la commande finger. La commande w qui est déjà disponible. Inutile d'installer finger. Le code devient :

for i in $(seq -f '%02g' 1 42)
do
   users=$(ssh MACHINE-0$i users)
   for user in $users
   do
      result=$(w -s | grep $user)

   done
done

Dernière modification par tiky (Le 10/01/2010, à 15:36)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#5 Le 10/01/2010, à 15:33

nesthib

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

bien vu l'option -f de seq wink

sinon pourquoi utiliser users et non who qui donne le tty utilisé, pas besoin d'installer quoi que ce soit

#!/usr/bin/env bash

for i in machine1 machine2 
do
	ssh $i who 2>/dev/null | egrep -q "^$1[[:blank:]]*tty7" && (notify-send 'trouvé' "$i" ; echo trouvé sur $i) &
done

#wait
exit 0

j'ai mis chaque ssh en background pour éviter d'attendre la fin de chaque connexion

edit:
- le script se lance avec le nom d'user à charcher en argument
- à adapter avec ta boucle pour les noms de machine
- on peut bien sûr virer le notify-send si pas d'interface graphiqe
- le wait (ici commenté) sert à attendre la fin de toutes les connexions ssh en tâche de fond afin de fermer le script, il faut bien sûr se connecter en ssh pas clé sinon impossible de taper le pass.

Dernière modification par nesthib (Le 10/01/2010, à 15:38)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 10/01/2010, à 15:38

tiky

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

nesthib a écrit :

bien vu l'option -f de seq wink

sinon pourquoi utiliser users et non who qui donne le tty utilisé, pas besoin d'installer quoi que ce soit

#!/usr/bin/env bash

for i in machine1 machine2 
do
	ssh $i who 2>/dev/null | egrep -q "^$1[[:blank:]]*tty7" && (notify-send 'trouvé' "$i" ; echo trouvé sur $i) &
done

#wait
exit 0

j'ai mis chaque ssh en background pour éviter d'attendre la fin de chaque connexion

J'ai édité le message wink. La commande w est mieux que who puisqu'elle affiche l'idle ce qui permet de savoir si la personne est réellement devant l'écran.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#7 Le 10/01/2010, à 15:45

nesthib

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

ton code me semble bizarre…
tu récupères la liste des users sur chaque machine distante mais tu testes si l'user est connecté sur la machine locale…

un simple :

ssh ${machine} "w -s" | egrep "^${user}[[:blank:]].*session"

te retournera 0 si la personne est logguée

Dernière modification par nesthib (Le 10/01/2010, à 15:47)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#8 Le 10/01/2010, à 15:53

tiky

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

nesthib a écrit :

ton code me semble bizarre…
tu récupères la liste des users sur chaque machine distante mais tu testes si l'user est connecté sur la machine locale…

un simple :

ssh ${machine} "w -s" | egrep "^${user}[[:blank:]].*session"

te retournera 0 si la personne est logguée

Oui tu as raison ^^', j'aurais dû le tester avant. L'idée importante étant la commande w de toute façon.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#9 Le 10/01/2010, à 17:26

Blabla404

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

Merci à vous, sujet résolu.

Hors ligne

#10 Le 10/01/2010, à 17:32

nesthib

Re : [Résolu][script] Savoir qui est loggé où. ssh+users+w

@redoxx : peut-être peux-tu mettre le script au propre dans ton premier post ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne