Projet envoi de SMS suivant retour commande


#1

Bonjour à tous,

j’execute ma commande qui me retourne des lignes comme ça :

64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.691 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.606 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.623 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.618 ms

Je voudrais alors pour chaque ligne exécuter une commande du type:

./send_sms.sh numberphone “text”

Ou text est égal à la valeur de time et numberphone est égal à une variable par rapport au numéro de séquence ICMP :

par exemple :

icmp_seq=1 = 0600012123
icmp_seq=2 = 0612345679

Quelqu’un serait faire cela ?
Merci de votre aide :slight_smile:


#2

Répondre

Heu! T’es sûr de ton coup, je reconnais le résultat de la commande ping. Et là du coup tu va envoyer 1 SMS par seconde à autant d’utilisateurs qu’il y aura de secondes.

A+


#3

Salut, j’ai utilisé la commande ping pour mes tests, ce sera une autre commande après.

J’ai déjà commencé un script sous la forme:

#!/bin/bash

#appel des scripts

send_sms.sh

#inscription des variables

emetteur_tel=( ["123456 Function"]="0612467890" ['24567 Function']="0786948172" ['4567890 
Function]="07878987" )


#boucle du programme



for line in `nc -l -u 7355 | sox -t raw -esigned-integer -b16 -r 48000 - -esigned-integer -b16 -r 22050 -t     
raw - | multimon-ng -t raw -a SCOPE -a POCSAG512 -a POCSAG1200 -a POCSAG2400 -f alpha -`

do 
emetteur_tel = `echo $line | cut -d : -f 3`
message = `echo $line | cut -d : -f 5`

./send_sms $emetteur_tel $message

...
echo $value>
done

#4

Bonjour,

Je ne connais pas le format de définition de variables utilisé pour emetteur_tel. Comment le lit-on ?
As-tu un exemple, une doc ?

Ce que je connais c’est ce format pour un tableau de variables, avec l’index de la variable obligatoirement un nombre entier.

http://www.epons.org/shell-bash-variables.php

VAR[1]="a"
VAR[2]="b"
echo ${VAR[1]}
echo ${VAR[2]}

Du coup il faut supprimer Function pour définir emetteur_tel comme suit

emetteur_tel["123456"]="060123456" 
emetteur_tel["234567"]="060234567" 
emetteur_tel["345678"]="060345678" 

Pour lire une sortie de commande ligne à ligne je conseille plutôt l’utilisation du format de substitution de processus avec une boucle while (enfin c’est comme ça que je fait)

https://abs.traduc.org/abs-fr/ch23.html

while IFS=":" read -r A B C D E F
do  code=${C##Function}
      message=$E
      send_sms "${emetteur_tel[${code}]}" "$message"
done < <(nc -l -u 7355 | sox -t raw -esigned-integer -b16 -r 48000 - -esigned-integer -b16 -r 22050 -t     
  raw - | multimon-ng -t raw -a SCOPE -a POCSAG512 -a POCSAG1200 -a POCSAG2400 -f alpha -)
  • IFS défini le caractère de séparation
  • J’ai repris le positionnement des champs en 3eme et 5eme position soit C et E pour les données à récupérer.
  • ${C##Function} récupère tout ce qu’il y a après Function
  • message=$E récupère la valeur du 3eme champ
  • ${emetteur_tel[${code}]} var chercher la valeur dans le tableau
  • Attention à ne pas définir le même nom de variable plusieurs fois (emetteur_tel)

Bon voilà c’est très dégrossi, et ça ne va probablement pas marcher du premier coup. Pour les derniers coup de tournevis, mettre des commandes echo pour voir la valeur des variables. Et lancer le script avec le options x et v pour voir la commande executée et son résultat.

bash -xv nom_du_script

A+


#5

Super, merci beaucoup c’est très explicite.
Pour emetteur_tel j’ai utilisé un tableau.

Je regarde tout ça et je te dis
Merci beaucoup


#6

Excellent, je ne savait pas les tableaux si puissant en bash.

Ci-joint un lien pour ceux que ça intéressent
http://www.ixany.org/docs/Shell_Les_tableaux_en_bash.html

A+