Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

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.

#26 Le 28/06/2017, à 08:28

DonutMan75

Re : [RESOLU] Flux de données dans un terminal

Merci Watael,
c'est fou comme on perd certains automatismes quand on passe d'un langage à l'autre !
Je me doutais que c'était un peu "bricolé", j'avais initialement tenté un "while 1" incorrect.

Bonne journée à tous et à bientôt !

Donut.

Hors ligne

#27 Le 28/06/2017, à 09:05

credenhill

Re : [RESOLU] Flux de données dans un terminal

essayer

bash -c "ssh -v [url] -p 1000 2>&1"  | awk -v max=5  'BEGIN....... 

pour voir si l'exit de awk tue le bash qui tue le ssh

Hors ligne

#28 Le 28/06/2017, à 09:12

BenjiBoy

Re : [RESOLU] Flux de données dans un terminal

Salut,
merci tout le monde.
credenhill, est-ce qu'une option ConnectTimeout dans le ssh ne réglerait pas le problème ?
J'ai lancé un contrab toute les 15 minutes je regarde ce que ça donne.

a+

Hors ligne

#29 Le 28/06/2017, à 13:11

credenhill

Re : [RESOLU] Flux de données dans un terminal

ConnectTimeout ce timeout ne sert qu'au moment de la connexion (man ssh_config)

Hors ligne

#30 Le 28/06/2017, à 13:46

credenhill

Re : [RESOLU] Flux de données dans un terminal

essayer, si il n'y a u'un seul ssh

ssh -v [url] -p 1000 2>&1 | awk -v pid=$(pgrep ssh) -v max=5  'BEGIN {print "V,I,VPV,LOAD,IL,H21"} 
$3 ~ /^V|^I|^LOAD|^IL/ {printf $4 ","} $3 ~ /^H21/ {print $4; if(n++==max){system("kill " pid); exit}}' >>test.log

Hors ligne

#31 Le 28/06/2017, à 15:03

BenjiBoy

Re : [RESOLU] Flux de données dans un terminal

J'ai momentanément déconnecté la station qui était en remote (car juste sur batterie en ce moment, pas de soleil dans le hangar!), le temps de la recharger :  je réessaierai demain, ta solution est intéressante (en plus de sembler plus "clean").

A+

Hors ligne

#32 Le 28/06/2017, à 15:31

DonutMan75

Re : [RESOLU] Flux de données dans un terminal

Hello,
après avoir tenté deux trois trucs, je ne pense pas que le problème vienne de awk ou de quoi que ce soit que tu puisses mettre après ton ssh.
Le problème vient que ton ssh envoie des données sans jamais envoyer de EOF et je crois que c'est ce qu'attend awk (donc il ne produit rien tant qu'il n'a pas reçu ce caractère) ? Attention : je ne suis pas du tout un expert de awk, si quelqu'un peut me confirmer que je ne me suis pas trompé ce serait cool smile

Autrement dit, la commande ne se termine jamais. N'écrit jamais rien. Et si on appuie sur Ctrl-C, eh bien on obtient rien à la fin !
Le comportement est différent avec grep vu qu'il travaille lui ligne à ligne...

EDIT : si je comprends la solution de credenhill, on fait tourner awk qui mouline, mouline.... et kill le ssh quand on a atteint la réception de nmax trames ?

On trouve ce comportement dans Google quand on tape "awk fifo"

J'ai créé deux scripts Shell.

Le premier, serveur.sh, va simuler l'envoi des trames que tu reçois sur un fifo donné :
Afin de différencier les trames succesives, le champ PID contient un entier qui s'incrémente à chaque envoi de trame.

#! /bin/sh
FIFO="./myssh.fifo"
N=0

if [ -e "$FIFO" ] ; then
	rm -rf "$FIFO"
fi

mkfifo "$FIFO"

while true ; do
	echo "ENVOI DE LA TRAME $N en cours..."
	echo "Checksum	" 		> "$FIFO"
	echo " - DEBUTE"
	echo "PID	$N" 		> "$FIFO"
	echo "FW	123" 		> "$FIFO"
	echo "SER#	HQ1533B2M5J" 	> "$FIFO"
	echo "V	12660" 			> "$FIFO"
	echo "I	-190" 			> "$FIFO"
	echo "VPV	0" 		> "$FIFO"
	echo "PPV	0" 		> "$FIFO"
	echo "CS	0" 		> "$FIFO"
	echo "ERR	0" 		> "$FIFO"
	echo "LOAD	ON" 		> "$FIFO"
	echo "IL	200" 		> "$FIFO"
	echo "H19	0" 		> "$FIFO"
	echo "H20	0" 		> "$FIFO"
	echo "H21	221"		> "$FIFO"
	echo "H22	0" 		> "$FIFO"
	echo "H23	0" 		> "$FIFO"
	echo "HSDS	0" 		> "$FIFO"
	echo " - FINI"
	sleep 1
	N=$((N+1))
done

Lorsqu'on le lance, il se met en attente dès l'envoi de la première ligne : il faut un lecteur.

Si on fait un tail -f du fifo, on voit bien passer les différentes trames et le serveur s'incrémente à chaque fois :

- COTE CLIENT -

$ tail -f myssh.fifo 
Checksum	
PID	0
FW	123
SER#	HQ1533B2M5J
V	12660
I	-190
VPV	0
PPV	0
CS	0
ERR	0
LOAD	ON
IL	200
H19	0
H20	0
H21	221
H22	0
H23	0
HSDS	0
Checksum	
PID	1
FW	123
SER#	HQ1533B2M5J
V	12660
I	-190
VPV	0
PPV	0
CS	0
ERR	0
LOAD	ON
IL	200
H19	0
H20	0
H21	221
H22	0
H23	0
HSDS	0

- COTE SERVEUR -

$ ./createur.sh 
ENVOI DE LA TRAME 0 en cours...
 - DEBUTE
 - FINI
ENVOI DE LA TRAME 1 en cours...
 - DEBUTE
 - FINI
ENVOI DE LA TRAME 2 en cours...
 - DEBUTE
 - FINI

Si on veut avoir un fichier de sortie comme tu le souhaites, c'est un peu la galère...
Pour que ça marche, il faut renoncer aux commandes qui traitent les fichiers dans leur globalité mais travailler sur des outils lignes à lignes.

On peut dans un premier temps remplacer notre tail par le script client.sh suivant :

#/bin/sh
FIFO="./myssh.fifo"

while read LIGNE ; do
	echo "Reception de : $LIGNE"
	sleep 1
done < "$FIFO"

On obtient alors :

./client.sh 
Reception de : Checksum
Reception de : PID	0
Reception de : FW	123
Reception de : SER#	HQ1533B2M5J
Reception de : V	12660
Reception de : I	-190
Reception de : VPV	0
Reception de : PPV	0
Reception de : CS	0
Reception de : ERR	0
Reception de : LOAD	ON
Reception de : IL	200
Reception de : H19	0
Reception de : H20	0
Reception de : H21	221
Reception de : H22	0
Reception de : H23	0
Reception de : HSDS	0
Reception de : Checksum
Reception de : PID	1
Reception de : FW	123
Reception de : SER#	HQ1533B2M5J
etc... etc...

Une fois qu'on a accès au "ligne à ligne" on peut traiter ça comme on veut.
Si la ligne contient PID, alors je l'écris dans le fichier de sortie etc...
On laisse tourner, on interrompt... et notre fichier de sortie est convenablement rempli !

Trois remarques :
- comment remplacer la lecture du fifo par la sortie d'un ssh ?
- j'ai du mettre des sleep dans la lecture sinon ça coupe... quelqu'un a une idée pour faire les choses proprement ?
- comment un ssh peut-il cracher des trucs en continu ? Initialement ça permet juste de se logger à distance non ?

Enfin voilà, j'espère ne pas avoir dit de trop grosses énormités.. et j'espère que ça aide (un peu ?)

Donut

Dernière modification par DonutMan75 (Le 28/06/2017, à 15:42)

Hors ligne

#33 Le 29/06/2017, à 08:53

BenjiBoy

Re : [RESOLU] Flux de données dans un terminal

Salut DonutMan75,

hum, j'ai l'impression (peut être erronée) que tu pars du principe que je maîtrise les trames qui sortent (côté serveur) ; elles sortent d'un régulateur solaire via sa programmation interne, je ne choisis pas comment. Ces trames série sortent une fois par seconde, en gros.

Et le SSH marche aussi bien que le telnet dans le cas présent, mais effectivement ce n'est pas une façon très normale de s'en servir, je pense.

Après, la commande de credenhill fonctionne très bien, même si je n'ai pas encore testé le kill du PID (prochainement).

L'étape d'après (si le kill fonctionne bien) sera d'intégrer le fichier texte ainsi créé dans NagiOS pour ceux qui connaissent.
Là je vais demander à un collègue parce que je suis une buse.

A bientôt

Hors ligne

#34 Le 29/06/2017, à 12:49

credenhill

Re : [RESOLU] Flux de données dans un terminal

j'ai testé, l'exit de awk ne stoppe pas le ssh, avec le kill ca marche

$ ssh localhost "seq 1 20; sleep 3600" | awk -v max=5 '{print; if(++n==max)exit}'; echo hop
1
2
3
4
5
^Chop  # <------- Ctrl-C pour reprendre la main
$ ssh localhost "seq 1 20; sleep 3600" | awk -v pid=$(pgrep -f "ssh loc") -v max=5 '{print; if(++n==max){system("kill " pid); exit}}'; echo hop
1
2
3
4
5
hop
$ 

changer le code pour le if et pour affiner le pgrep

ssh -v [url] -p 1000 2>&1 | awk -v pid=$(pgrep -f "ssh -v ") -v max=5  'BEGIN {print "V,I,VPV,LOAD,IL,H21"} 
$3 ~ /^V|^I|^LOAD|^IL/ {printf $4 ","} $3 ~ /^H21/ {print $4; if(++n==max){system("kill " pid); exit}}' >>test.log

Dernière modification par credenhill (Le 29/06/2017, à 13:01)

Hors ligne

#35 Le 29/06/2017, à 19:45

LeoMajor

Re : [RESOLU] Flux de données dans un terminal

bonjour,
regarde du côté d'expect & tcl; le spawn sera basé sur le ssh et tu pourras décortiquer le buffer ligne/ligne, même si il n'y a pas de EOF évident. L'interception de la capture se fait par un motif d'expression régulière.

Hors ligne

#36 Le 29/08/2017, à 09:03

BenjiBoy

Re : [RESOLU] Flux de données dans un terminal

Bonjour à tous,

juste pour faire un petit retour rapide histoire qu'on sache à quoi ça sert, nous avons réussis à transformer la trame intarissable en quelque chose de bitable, en l'intégrant à notre soft de monitoring (NagiOS pour ceux qui connaissent).

Ca donne un suivi super précis en temps réel des infos de production d'énergie, de ce que consomment les numériseurs, des différents paramètres environnementaux, tout ça ...
Je vois fais suivre des graphes des dernières semaines, car les stations ont été installées depuis.
Petit exemple la production de courant via le solaire :
170829092815863844.png
(valeur en A)
La conso de nos appareils :
170829092815781068.png
(Valeur en A)

Voilou,
merci beaucoup pour votre aide,
une bonne journée.

Dernière modification par BenjiBoy (Le 29/08/2017, à 09:05)

Hors ligne