Afficher les utilisateurs connectés

bonjour
je me tourne vers vous quart je ne voie pas très bien comment je peux réaliser mon truc .

je bloque sur comment afficher les utilisateurs loguer au moment ou je me logue, je ne souhaite voir que le login nbr de connexion adresse ip
j ai réaliser la commande suivante mais j ai pas c vraiment ce que je veux .

après avoir exécuter la commande elle me ressort ceci

Jan:11:moi : 213.30.164.49 Jan:11:moi : 62.201.42.25 Jan:11:uber : 82.224.60.50 Jan:12:uber : 81.57.23.60 Jan:13:uber : 88.191.22.15
alors que si je regarde les logs je voie ceci

Jan:12:22:04:48:uber : 81.57.23.60 Jan:13:09:58:22:uber : 88.191.22.15 Jan:13:10:48:02:uber : 78.27.185.125 Jan:13:11:02:38:uber : 78.27.185.125 Jan:13:11:33:11:moi : 78.27.185.125
ma question et donc la suivante comment lui dire que je ne veux voir que ceux qui sont connectée aujourd’hui et non y a trois jour

je viens de trouver la solutions à mon problème, la commande suivante me permet de savoir le nombre de connection open sur le poste ainsi que les ip.
il y a encore un petit truc qui me chagrine je souhaiterais afficher les ip a cote du nbr de connexion et non en dessous .
savez vous comment je peux faire .

who | awk 'BEGIN{ n=0 } NR <= n arr[$1]++; END{for(i in arr){ print i, arr[i] }}' && finger | cut -c37-49,58-72 |sort -n -k2

?

?

Une petite explication de ta ligne SED ne ferais pas de mal :mrgreen: SED et les expression régulière étant connu pour leur limpidité :unamused:

Salut,

J’ai deux machines de lancées à mon nom, j’ai mis un certain à réaliser pourquoi j’apparaissait deux foix :slightly_smiling:
Le nom de la machine en regard de l’utilisateur serait un plus :slightly_smiling:

  • [:space:]: espace ou tabulation
    -> [^[:space]] : différent d’espace ou tabulation
    -> [^[:space]]+ : répété au moins une fois -> n’importe quelle chaine de caractère ne contenant pas d’espace ni de tabulation

  • chaque partie se trouvant entre ( et ) est récupérable dans la deuxième partie de la substition via \1, \2, \3
    -> ^([^[:space:]]+) va me permettre de récupérer la première chaine de caractère, i.e le login (le ^ indiquant le début de la ligne (quand il n’est pas entre crochets)).
    -> de la même façon, i$[/i] me permettra de récupérer la chaine entre parenthèses à la fin de la ligne (le $ c’est pour la fin de la ligne), soit l’adresse IP.

Comme je me fous de ce qu’il y a entre les deux, je mets un .*.

En espérant avoir été clair… :017

Il semblerait que quand l’IP est resolvable par la machine, ce soit le nom qui apparaissent dans la commande who.
Sinon, j’aurais pu faire une regex un peu plus complexe… :laughing:

Bonjour,

Juste pour le fun :

# sans mise en forme
who | awk -F "[ ()]" '{print $1, $(NF-1)}'
# avec mise en forme
who | awk -F "[ ()]" '{printf "%-10s%15s\n", $1, $(NF-1)}'

Merci Kna :023

pensez vous qu’il est possible avec la commande sed
d’avoir que les champs login, date heure, adresse ip, et non pas tout le champs adresse ip

j’étudie plus en détaille la commande sed que je ne connais pas du tout ou presque pas, je suis entrain de voir la commande de kna

who | sed 's/\([ ]\+\).*(\(\))$/\1 \2/' && echo ' hy' moi pts/0 2011-01-19 10:58 (pla93-6-78-22-190-125.fbx.proxad.net)

voici l’adresse d’un site que j ai trouver qui explique le fonctionnement de la commande
http://www.lmd.ens.fr/Ressources-Info/Unix-Doc/html/cours-unix-12.html

À la reflexion, l’utilisation de sed n’était pas la plus judicieuse :

donne le même résultat que ma commande précédente, mais avec une syntaxe un peu plus claire (on prend les champs 1 et 5, séparés par " - ", et on enlève les parenthèses avec tr)
Tu peux alors choisir les champs que tu veux.

zyriuse :Ce que tu vois est le reverse DNS de ton adresse IP. Vu que ça dépend du FAI, tu ne peux pas filtrer avec une regex…
Mais tu peux refaire la résolution inverse :

# On change l'IFS pour lire ligne par ligne
IFS=''

for line in `who` ; do
    # On affiche le login, la date et l'heure, sans retour à la ligne
    echo $line | awk '{print $1 " - " $3 " - " $4 " - "}' | tr -d "\n"
    
    # On récupère l'adresse
    addr=`echo $line | awk '{print$5}' | tr -d '()'`
    
    # Si on peut la résoudre, on la résoud, sinon on l'affiche tel quel
    if host $addr >/dev/null ; then
        dig $addr a +short
    else
        echo $addr
    fi
done

[quote=“kna”]À la reflexion, l’utilisation de sed n’était pas la plus judicieuse :

[/quote]
ce qui revient à ça

[quote=“kna”]

[code]

On change l’IFS pour lire ligne par ligne

[…]done
[/code][/quote]

while IFS=' ()' read -a infos
do
  printf "%s - %s - %s - " ${infos[0]} ${infos[2]} ${infos[3]}
  host ${info[4]} >&/dev/null && dig ${info[4]} a +short || echo ${info[4]}
done < <(who)

bonjour
j ai du mal à tout comprendre dans le script totor
je comprend bien IFS <-- variable de séparation.
je ne comprend d’ou viens le -a de read -a infos

et aussi pourquoi fais tu ceci ?

merci de bien vouloir m expliquer

5 mois sans faire de script shell et je suis rouiller :angry: :angry:

l’option -a : c’est pour décomposer la ligne lue en un tableau (dont le nom est “infos”)
host ${infos[4]} >&/dev/null : as-t’on des informations sur la machine dont le nom se trouve à l’indice 4 du tableau “infos”. Si oui, le statut de la commande vaut 0, si non le statut est <> 0. Et on redirige la sortie standard et d’erreur à la poubelle (>& désigne à la fois la sortie standard et la sortie d’erreur)

excuse moi de te déranger encore totor .
voici ce qui s’affiche a la place de l adresse ip comment faire pour ne sélectionner que les 4 bit de l adresse ip j ai essayer avec un cut passer en variable, mais quand je viens à le mettre à la suite il m’affiche tout en double :blush:

pla93-6-78-22-184-125.fbx.proxad.net

quel est ton code ?

j ai repris le meme code que celui que tu ma fais plus haut .

CONNECTION_IP=`who | cut -c48-62`
#echo $CONNECTION_IP
echo "###############################"
while IFS='  ' read -a infos
do
  printf "%s: %s: %s: " ${infos[0]} ${infos[2]} ${infos[3]} #$CONNECTION_IP
#  printf "%s " ${infos[4]} | cut -c48-62
 host ${info[4]} >&/dev/null && dig ${info[4]}  +short || echo ${info[4]}

done < <(who)
~

voici ce que j ai crée mais je trouve sa un peu crade

j ai utiliser la commande finger parce que je ne savais pas que who me listé tous les users connectée.

Salut,

Je n’ai pas finger sur une station Linux sous la main et pas possible de l’installer.
Je l’ai juste sur un serveur AIX. J’espère donc que la sortie que j’obtiens correspond à ce que tu recherches.

printf "%20s%20s%20s\n" Login When Where
while read -a infos
do
((i++)) && printf "%20s%20s%20s\n" ${infos[0]} "${infos[4]} ${infos[5]}" ${infos[6]}
dones < <(finger)

merci totor tu viens de me faire rappeler comment on fait pour faire les espaces j étais justement entrain de chercher .

printf "%20s%20s%20s\n" 

merci pour tout :041 :023

de rien. la communauté est là pour cela.
d’ailleurs, un alignement à gauche serait préférable :

printf "%-20s%-20s%-20s\n" 

après, c’est une histoire de gout.

quand j aurais finis avec tout le bazar je le déposerais dans la section script pour que tout le monde puisse en profiter.