#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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
bien vu l'option -f de seq
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 . 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne