Accueil Problèmes et solutions
routeur4g.fr est financé par ses lecteurs. Quand vous achetez en passant par les liens du site, nous pouvons toucher une commission d’affiliation.

[TUTO] Envoyer des SMS en ligne de commande

oga83oga83 Membre Messages: 1121
Modifié (février 2020) dans Problèmes et solutions
J'ai écrit un script pour envoyer des SMS en ligne de commande sous Linux.

Pour l'utiliser, il suffit de lui passer les paramètres suivants :
- L'adresse IP du routeur
- Le nom d'utilisateur (généralement admin)
- Le mot de passe de l'utilisateur
- Le n° de téléphone vers lequel on veut envoyer un SMS (sans espaces)
- Le contenu du SMS

Par exemple :
./sendsms_huawei.sh 192.168.0.1 admin MonMotDePasse 0601020304 'Exemple de SMS'
Le script sendsms_huawei.sh se trouve dans l'archive zip ci-dessous.

Il est également possible de le faire sans script, avec Huawei Monitor, en utilisant l'url suivante :
<a rel="nofollow" href="http://192.168.0.1:8080/sms/send.aspx?tel=0601020304&message=Exemple de SMS"><code>http://x.x.x.x:8080/sms/send.aspx?tel=0601020304&message=Exemple de SMS
x.x.x.x est l'adresse IP de la machine sur laquelle fonctionne Huawei Monitor (pas celle du routeur !).
L'avantage de cette dernière méthode est qu'elle peut facilement être utilisée sous Windows en téléchargeant l'utilitaire wget :
/sms/send.aspx?tel=0601020304&message=Exemple de SMS"<div><code>wget "<code>http://x.x.x.x:8080
Voir également un autre exemple d'utilisation ici.
Si ce genre de post vous plait, n'oubliez pas de le promotionner pour que j'en fasse d'autres !
Message edité par ludovick on

Réponses

  • stephanestephane Membre Messages: 160
    Ca tombe à pic je m'apprêtais à en écrire un  ;)
    Je ne l'ai pas encore testé je suis au taf mais en lisant le code ces 2 grep me semblent curieux :smile:

    # Get token from header
    	NEWTOKEN=`cat $TMP_HEADER_FILE | grep "__RequestVerificationTokenone: " | awk -F' ' '{print $2}'`
    	if [ ! -z "$NEWTOKEN" ]; then TOKEN=$NEWTOKEN; fi
    	NEWTOKEN=`cat $TMP_HEADER_FILE | grep "__RequestVerificationToke: " | awk -F' ' '{print $2}'`
    Tu reçois vraiment __RequestVerificationTokenone et __RequestVerificationToke comme noms de headers dans la response HTTP ?
    J'aurais plutôt pensé à à __RequestVerificationToken non ?

  • oga83oga83 Membre Messages: 1121
    Modifié (novembre 2019)
    Merci, il manque bien le n final pour le 2ème grep, même si ça marche quand même pour l'envoi d'un seul sms.
    Pour le 1er grep, on reçoit bien "Token one".
    J'ai corrigé le script attaché au post initial.

  • stephanestephane Membre Messages: 160
    J'ai testé ton script hier soir et je n'ai pas réussi à le faire fonctionner. Le problème vient je pense du fait que mon mot de passe commence par ! du coup le shell pense qu'il s'agit d'une commande de mon historique bash.

    Voilà les différentes commandes que j'ai essayé sans succès :
    ./sendsms_huawei.sh 192.168.1.1 "admin" "!ShhtItsASecret" 06******** "I'm Up and Online!"
    ./sendsms_huawei.sh 192.168.1.1 "admin" "\!ShhtItsASecret" 06******** "I'm Up and Online!"
    ./sendsms_huawei.sh 192.168.1.1 "admin" "\!ShhtItsASecret" "06********" "I'm Up and Online!"
    <div><br></div>

    Du coup j'ai mis le mdp directement dans le code HTML du FORM que tu postes au router et pas mieux.
    Je vais creuser quand j'aurais un moment. 
    En tout cas AUCUNE urgence de mon coté alors ne stresses pas sur le correctif  ;)

  • oga83oga83 Membre Messages: 1121
    Ben ça, c'est plutôt facile à tester : il suffit d'essayer un autre mot de passe ;)

  • stephanestephane Membre Messages: 160
    Oui effectivement je peux changer le mdp du router. Je creuserais le sujet à moment perdu.
  • superninjasuperninja Membre Messages: 2
    Modifié (décembre 2019)
    Il est également possible de le faire sans script, avec Huawei Monitor, en utilisant l'url
    @oga83
    Est ce qu'il y a une limitation en nombre de SMS envoyé, par HM (version gratuite) ?
    car avec la commande http GET sur mon Flow Node Red:
    http://192.168.1.126:8080/sms/send.aspx?tel=0610101010&message=hello


    j'ai un retour de mon application apres 4 SMS envoyés  :'(
    <!doctype html><html><body><h2>402 Error ! A license is required to use this function...</h2></body></html>
    Note : l'envoi de SMS depuis HM marche bien .

    Merci
  • oga83oga83 Membre Messages: 1121
    Modifié (décembre 2019)
    @superninja Oui, comme indiqué dans le message
  • CaelionCaelion Membre Messages: 6
    Bonjour Oga83,
    Merci pour ce script. Je suis très intéressé par son utilisation sur mon routeur B715S-23C pour utiliser avec Jeedom en système de notification.
    J'ai voulu le tester sur une debian10 tout fraichement installé avec uniquement un accès ssh.

    J'ai procédé ainsi :
    - Connexion SSH en user
    - Création du fichier sendsms_huawei.sh dans mon répertoire user par défaut
    - Exécution de la commande suivante
    ./sendsms_huawei.sh IPsansquote admin motdepassesansquote telephonesansquote 'Message avec guillemet'

    Mais j'ai le retour suivant :
    ./sendsms_huawei.sh: 1: ./sendsms_huawei.sh: curl: not found
    cat: /tmp/headers.tmp: Aucun fichier ou dossier de ce type

    J'ai également essayé root à la place d'admin mais ce n'est pas mieux.

    L'un de vous pourrait-il  m'aider à résoudre ce point s'il te plaît ?
    Je continue à chercher et vous tiens informer si je trouve d'ici la réponse
    Merci beaucoup
    Bien à vous,
    Caelion

  • oga83oga83 Membre Messages: 1121
    Caelion a dit :
    ./sendsms_huawei.sh: 1: ./sendsms_huawei.sh: curl: not found
    Curl n'est pas installé...
    apt-get install curl

  • CaelionCaelion Membre Messages: 6
    Oula, j'étais vraiment pas réveillé.
    Merci Oga83,
    Cela fonctionne nickel
    J'ai plus qu'à trouver comment l'intégrer dans ma solution domotique (Jeedom) car pour l'instant ça ne fonctionne pas :)
  • CaelionCaelion Membre Messages: 6
    Bonjour 0ga83,
    J'ai réussi à faire ce que je voulais avec ton script, merci beaucoup. J'en ai profité pour me rédiger un script complémentaire pour récupérer les informations sur des pages d'API ne nécessitant pas de connexion (tel que http://192.168.1.1/api/monitoring/traffic-statistics).
    Il me reste le sujet de certaines informations qui sont sur des pages d'API nécessitant une connexion (par exemple http://192.168.1.1/api/device/signal).
    Saurais-tu les modifications à apporter à ton script pour récupérer les informations ?
    Merci pour ton aide
    Bien à toi,
    Caelion



  • oga83oga83 Membre Messages: 1121
    Caelion a dit :
    Saurais-tu les modifications à apporter à ton script pour récupérer les informations ?
    @Caelion Non, désolé. ça dépend trop de ce que tu veux faire et ça dépasse largement le cadre de ce post.
  • CaelionCaelion Membre Messages: 6
    Modifié (février 2020)
    Merci pour ton retour.

    En fait pour exemple, l'url http://192.168.1.1/api/sms/sms-count est accessible directement.
    Si on va dessus, on peut via le script simple suivant (que nous appelons par exemple SMS.sh) :
    #!/bin/sh<br>extract_from_xml() {<br>    reponse=`echo "$1" | sed -n "s/.*<$2>\\([^<]\\+\\)<.*$/\\1/p"`<br>}<br><br>if [ "$1" = "SMS_Statistiques" ]<br>then<br>	content=$(wget http://192.168.1.1/api/sms/sms-count -q -O -)<br>	if [ "$2" = "Inbox" ]<br>	then<br>		extract_from_xml "$content" "LocalInbox"<br>        echo $reponse<br>		exit 0<br>	elif [ "$2" = "Outbox" ]<br>	then<br>		extract_from_xml "$content" "LocalOutbox"<br>        echo $reponse<br>		exit 0<br>	elif [ "$2" = "Unread" ]<br>	then<br>		extract_from_xml "$content" "LocalUnread"<br>        echo $reponse<br>		exit 0<br>	fi<br>fi<br>
    Récupérer avec la ligne
    SMS.sh SMS_Statistiques Inbox 
    Le nombre de SMS présent dans l'Inbox, idem avec Outbox ou Unread

    Pour certaines autres pages, de type http://192.168.1.1/api/device/signal
    - Si on y a va directement : on a un code erreur
    - Si on va d'abord sur la page d'accueil du routeur et que l'on s'identifie, puis que l'on entre à nouveau cette adresse, on arrive à une page équivalente à l'url des SMS (http://192.168.1.1/api/sms/sms-count) mais relative à des données de signaux du routeur sur laquelle nous pouvons exploiter facilement les données.

    Ton script va sur l'url http://192.168.1.1/api/sms/send-sms avec justement cette étape d'authentification que je souhaiterais reproduire pour accéder à la page internet et ensuite reproduire mon script actuel pour récupérer les informations.

    Bien à toi,
    Caelion
  • misterg94misterg94 Membre Messages: 8
    stephane a dit :
    J'ai testé ton script hier soir et je n'ai pas réussi à le faire fonctionner. Le problème vient je pense du fait que mon mot de passe commence par ! du coup le shell pense qu'il s'agit d'une commande de mon historique bash.

    Voilà les différentes commandes que j'ai essayé sans succès :
    ./sendsms_huawei.sh 192.168.1.1 "admin" "!ShhtItsASecret" 06******** "I'm Up and Online!"
    ./sendsms_huawei.sh 192.168.1.1 "admin" "\!ShhtItsASecret" 06******** "I'm Up and Online!"
    ./sendsms_huawei.sh 192.168.1.1 "admin" "\!ShhtItsASecret" "06********" "I'm Up and Online!"
    <div><br></div>

    Du coup j'ai mis le mdp directement dans le code HTML du FORM que tu postes au router et pas mieux.
    Je vais creuser quand j'aurais un moment. 
    En tout cas AUCUNE urgence de mon coté alors ne stresses pas sur le correctif  ;)

    Dans le script de oga83, il faut modifier la ligne N°68 comme ceci pour ne plus avoir de soucis avec son mot de passe :

    Remplacer "CREDENTIALS=`printf $ROUTER_PASSWORD | sha256sum | head -c64 | base64 -w0`"
    par "CREDENTIALS=`printf %s $ROUTER_PASSWORD | sha256sum | head -c64 | base64 -w0`"

    On précise à printf que la variable $ROUTER_PASSWORD est de type string avec l'argument %s.

    Je pense qu'il s'agit d'un oubli :)

    Ça fonctionne pour moi ! 

    Merci à oga83 pour cette exemple de script utilisant les api huawei.
  • FabLabFabLab Membre Messages: 13
    Salut à tous

    Est ce qu'un possesseur de B315s22 à réussi à se logger avec ce code?

    Je ne suis pas encore sous linux, mais encore sous terminal Mac, les commandes sont un peu différentes, je les adapte, mais ce qui m'étonne surtout ce sont les requêtes à envoyer pour mon B315s22.

    Si je regarde les requêtes qu'envoi Firefox quand je me log avec mon mot de passe, elles ne correspondent pas du tout à ce script:

    Le GET pour récupérer le premier Token et le Cookie, c'est ok.
    Mais le POST 'challenge_login' envoi la requête:

    <?xml version="1.0" encoding="UTF-8"?>
    <request>
    <username>admin</username><firstnonce>3e8a19dadd5824468b805a6892505ef9b9c19729c4258b71fbee1b06ecf543e5</firstnonce><mode>1</mode>
    </request>

    Je suppose qu'à ce moment là on récupère un code 'salt et 'servernonce' dans la 'response'. Et qu'il faut le crypter pour créer un 'clientproof'.

    En même temps le POST 'authentication_login' envoi:

    <?xml version="1.0" encoding="UTF-8"?>
    <request><clientproof>aa3e793d0ce66c8736e38154a938d270c08c90d79e7e9592afc702d01d71ef17</clientproof><finalnonce>3e8a19dadd5824468b805a6892505ef9b9c19729c4258b71fbee1b06ecf543e54LtkDOHC6WwFKPjDCeDCdaLC6MD9cdJw</finalnonce>
    </request>

    Concernant le premier hashage de mot de passe (3e8a… …), j'ai cherché à savoir comment il pouvait être crypté, j'ai trouvé ceci:

    https://gist.github.com/magicdude4eva/5a8d14fe7c08262408e0356953a617cb

    C'est en php et beaucoup trop pointu pour un amateur comme moi. Ce code serait pour un B618, routeur  plus évolué que mon B315, ça m'étonne que je sois obligé de hasher autant le mot de passe.
    J'ai bien essayé avec la méthode du script au dessus (hash 256, base64 … etc…), mais rien ne correspond.

    Pour info. Aujourd'hui je peux récupérer sous bash et grâce à un petit script (écrit avec les pieds mais qui marche :-) qui ressemble à la commande ping, toutes les infos qui ne nécessitent pas de mot de passe.
    Mais j'aimerais bien me logger au routeur pour lui envoyer des requêtes.

    Aussi, si à tout hasard un programmeur avait un début d'info là dessus, je suis preneur. Merci d'avance.
  • oga83oga83 Membre Messages: 1121
    @FabLab Le script du 1er post fonctionne t'il ?
    FabLab a dit :
    Concernant le premier hashage de mot de passe (3e8a… …), j'ai cherché à savoir comment il pouvait être crypté
    Si tiu parles du "<firstnonce>3e8a19dadd5824468b805a6892505ef9b9c19729c4258b71fbee1b06ecf543e5</firstnonce>", il ne s'agit pas d'un mot de passe hashé. C'est juste d'une valeur aléatoire générée par le routeur à utiliser par le client pour "salter" le mot de passe hashé à envoyer au routeur (de telle manière que ces requêtes ne puissent pas être rejouées par un tiers). Ce "nonce" est différent à chaque demande de connexion.
    Pour voir comment le mot de passe est salté/hashé, il suffit de regarder dans le script.
    Le username est concaténé avec mot de passe base64, salté par concaténation du token de session, puis le tout est hashé sha256 et enfin converti en base64 :
    CREDENTIALS=`printf $ROUTER_PASSWORD | sha256sum | head -c64 | base64 -w0`<br>CREDENTIALS=`printf "%s%s%s" $ROUTER_USERNAME $CREDENTIALS $TOKEN | sha256sum | head -c64 | base64 -w0`<br>



  • FabLabFabLab Membre Messages: 13
    Bonjour

    Non le script ne fonctionne pas, sous bash Mac sha256sum n'est pas une commande reconnu par exemple.
    J'ai tenté d'adapter ce script, comme ceci:
    (j'ai juste appelé la variable différemment pour voir si ça fonctionne, mais même avec CREDENTIALS c'est pareil)
    Les cookie et token sont d'une session réelle.

    COOKIE="SessionID=6Lm83/CAzhRat5KIPoZ7jy1VLbaKGSVmzVi7Y654SY93+CCzRM6smNBDeQI9esajrTyKa+qo3VacbyIo60S+oI2Ghez92xDaFTJyXzasDsJM2W5Nl3BIcSZmGUeqc+jM"
    TOKEN="956fZRaK+KSWpc/3HOO3pIm5DauJPekI"

    ROUTER_USERNAME="admin"
    ROUTER_PASSWORD="MonMotDePasse"
    HASHPASSWORD=`printf "%s" $ROUTER_PASSWORD | openssl sha256 | openssl enc -base64 | head -c64`
    echo "HASHPASSWORD1:" $HASHPASSWORD
    HASHPASSWORD=`printf "%s%s%s" $ROUTER_USERNAME$HASHPASSWORD$TOKEN | openssl sha256 | openssl enc -base64 | head -c64`
    echo "HASHPASSWORD2:" $HASHPASSWORD

    Bash me répond:

    HASHPASSWORD1: NTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj
    HASHPASSWORD2: N2QyZTEwM2UxMjE5MDIzMWJiNTMwZGEzMTU0YzgxNDNjZDYzNTY1MDQzYzQ5Y2Yy
    
    Et en mode débug:

    + COOKIE=SessionID=6Lm83/CAzhRat5KIPoZ7jy1VLbaKGSVmzVi7Y654SY93+CCzRM6smNBDeQI9esajrTyKa+qo3VacbyIo60S+oI2Ghez92xDaFTJyXzasDsJM2W5Nl3BIcSZmGUeqc+jM
    + TOKEN=956fZRaK+KSWpc/3HOO3pIm5DauJPekI
    + ROUTER_IP=192.168.8.1
    + ROUTER_USERNAME=admin
    + ROUTER_PASSWORD=MonMotDePasse
    ++ printf %s MonMotDePasse
    ++ openssl sha256
    ++ openssl enc -base64
    ++ head -c64
    + HASHPASSWORD=NTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj
    + echo HASHPASSWORD1: NTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj
    HASHPASSWORD1: NTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj
    ++ printf %s%s%s adminNTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj956fZRaK+KSWpc/3HOO3pIm5DauJPekI
    ++ openssl sha256
    ++ openssl enc -base64
    ++ head -c64
    + HASHPASSWORD=N2QyZTEwM2UxMjE5MDIzMWJiNTMwZGEzMTU0YzgxNDNjZDYzNTY1MDQzYzQ5Y2Yy
    + echo HASHPASSWORD2: N2QyZTEwM2UxMjE5MDIzMWJiNTMwZGEzMTU0YzgxNDNjZDYzNTY1MDQzYzQ5Y2Yy
    HASHPASSWORD2: N2QyZTEwM2UxMjE5MDIzMWJiNTMwZGEzMTU0YzgxNDNjZDYzNTY1MDQzYzQ5Y2Yy
    + echo
    

    Ce n'est que la partie hashage, mais en réel le router renvoi toujours une code erreur 125002, donc je voudrais au moins valider cette partie là avant d'aller plus loin, surtout que le routeur se bloque après un certains nombre de tentative de loggin erronées.

    En essayant avec des décodeurs (hash 256 et base64) en ligne, je trouve le même résultat, donc je suppose que l'adaptation de mon code fonctionne… Je suppose…
    Est ce que vous pouvez valider le script de hashage avec les mêmes mot de passe, cookie, token avec le script sous linux, svp?

  • FabLabFabLab Membre Messages: 13
    Modifié (novembre 2020)
    Si j'essai d'exécuter le script tel quel, voilà ce qu'il me renvoi:

    Il récupère bien le SessionID et le premier Token, mais ne va pas plus loin car bash ne comprend pas les arguments de la commande grep, je pense.
    Le mot de passe utilisé ici est réel et reconnu correctement avec un navigateur. Je mets un numéro bidon, puisqu'il ne va pas plus loin que le hashage.

    bash-5.0 ~ $ bash sendsms_huawei.sh 192.168.8.1 admin passwordadmin 0605040302 TEST
    
    usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
            [-e pattern] [-f file] [--binary-files=value] [--color=when]
            [--context[=num]] [--directories=action] [--label] [--line-buffered]
            [--null] [pattern] [file ...]
    usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
            [-e pattern] [-f file] [--binary-files=value] [--color=when]
            [--context[=num]] [--directories=action] [--label] [--line-buffered]
            [--null] [pattern] [file ...]
    base64: invalid option -- w
    Usage:  base64 [-hvD] [-b num] [-i in_file] [-o out_file]
      -h, --help     display this message
      -D, --decode   decodes input
      -b, --break    break encoded string into num character lines
      -i, --input    input file (default: "-" for stdin)
      -o, --output   output file (default: "-" for stdout)
    sendsms_huawei.sh: ligne 68: sha256sum : commande introuvable
    sendsms_huawei.sh: ligne 69: sha256sum : commande introuvable
    base64: invalid option -- w
    Usage:  base64 [-hvD] [-b num] [-i in_file] [-o out_file]
      -h, --help     display this message
      -D, --decode   decodes input
      -b, --break    break encoded string into num character lines
      -i, --input    input file (default: "-" for stdin)
      -o, --output   output file (default: "-" for stdout)

    bash-5.0 ~ $ bash -x sendsms_huawei.sh 192.168.8.1 admin passwordadmin 0605040302 TEST
    
    + '[' 5 -ne 5 ']'
    + ROUTER_IP=192.168.8.1
    + ROUTER_USERNAME=admin
    + ROUTER_PASSWORD=passwordadmin
    + SMS_NUMBER=0605040302
    + SMS_TEXT=TEST
    + TMP_HEADER_FILE=/tmp/headers.tmp
    + CURL_OPT=--silent
    + GetSessionToken
    + GetRouterData /api/webserver/SesTokInfo
    ++ curl --silent --request GET http://192.168.8.1/api/webserver/SesTokInfo --dump-header /tmp/headers.tmp -H 'Cookie: ' -H '__RequestVerificationToken: ' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
    + RESPONSE='<?xml version="1.0" encoding="UTF-8"?>
    <response>
    <SesInfo>SessionID=dmMNKahToNGV0Da9sjRSiGF9gnjZdnSqSgcJn0SKbKGcDHzc0IMD/gUZrj9DKwsWyOydpLlLxiYsrKnvyO8j+sq9hiWjzToM5trfRHtV3b1oRbgrVug2GE4P0bGttiMb</SesInfo>
    <TokInfo>vDpkf+S8rXBHsZLG6b36ZfU1SjVfT9As</TokInfo>
    '/response>
    + ProcessRouterResponseHeader
    ++ cat /tmp/headers.tmp
    ++ grep '__RequestVerificationTokenone: '
    ++ awk '{print $2}'
    + NEWTOKEN=
    + '[' '!' -z '' ']'
    ++ cat /tmp/headers.tmp
    ++ grep '__RequestVerificationToken: '
    ++ awk '-F ' '{print $2}'
    + NEWTOKEN=
    + '[' '!' -z '' ']'
    ++ cat /tmp/headers.tmp
    ++ grep 'Set-Cookie: SessionID='
    ++ awk '-F ' '{print $2}'
    ++ cut -b 1-138
    + NEWSESSIONID=
    + '[' '!' -z '' ']'
    + echo
    
    ++ echo '<?xml version="1.0" encoding="UTF-8"?>
    <response>
    <SesInfo>SessionID=dmMNKahToNGV0Da9sjRSiGF9gnjZdnSqSgcJn0SKbKGcDHzc0IMD/gUZrj9DKwsWyOydpLlLxiYsrKnvyO8j+sq9hiWjzToM5trfRHtV3b1oRbgrVug2GE4P0bGttiMb</SesInfo>
    <TokInfo>vDpkf+S8rXBHsZLG6b36ZfU1SjVfT9As</TokInfo>
    '/response>
    ++ grep -oPm1 '(?<=<SesInfo>)[^<]+'
    usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
            [-e pattern] [-f file] [--binary-files=value] [--color=when]
            [--context[=num]] [--directories=action] [--label] [--line-buffered]
            [--null] [pattern] [file ...]
    + SESSIONID=SessionID=
    ++ echo '<?xml version="1.0" encoding="UTF-8"?>
    <response>
    <SesInfo>SessionID=dmMNKahToNGV0Da9sjRSiGF9gnjZdnSqSgcJn0SKbKGcDHzc0IMD/gUZrj9DKwsWyOydpLlLxiYsrKnvyO8j+sq9hiWjzToM5trfRHtV3b1oRbgrVug2GE4P0bGttiMb</SesInfo>
    <TokInfo>vDpkf+S8rXBHsZLG6b36ZfU1SjVfT9As</TokInfo>
    '/response>
    ++ grep -oPm1 '(?<=<TokInfo>)[^<]+'
    usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
            [-e pattern] [-f file] [--binary-files=value] [--color=when]
            [--context[=num]] [--directories=action] [--label] [--line-buffered]
            [--null] [pattern] [file ...]
    + TOKEN=
    ++ printf %s passwordadmin
    ++ sha256sum
    sendsms_huawei.sh: ligne 68: sha256sum : commande introuvable
    ++ head -c64
    ++ base64 -w0
    base64: invalid option -- w
    Usage:  base64 [-hvD] [-b num] [-i in_file] [-o out_file]
      -h, --help     display this message
      -D, --decode   decodes input
      -b, --break    break encoded string into num character lines
      -i, --input    input file (default: "-" for stdin)
      -o, --output   output file (default: "-" for stdout)
    + CREDENTIALS=
    ++ printf %s%s%s admin
    ++ sha256sum
    sendsms_huawei.sh: ligne 69: sha256sum : commande introuvable
    ++ head -c64
    ++ base64 -w0
    base64: invalid option -- w
    Usage:  base64 [-hvD] [-b num] [-i in_file] [-o out_file]
      -h, --help     display this message
      -D, --decode   decodes input
      -b, --break    break encoded string into num character lines
      -i, --input    input file (default: "-" for stdin)
      -o, --output   output file (default: "-" for stdout)
    + CREDENTIALS=
    ++ printf '<request><Username>%s</Username><Password>%s</Password><password_type>4</password_type></request>' admin
    + DATA='<request><Username>admin</Username><Password></Password><password_type>4</password_type></request>'
    + PostRouterData /api/user/login '<request><Username>admin</Username><Password></Password><password_type>4</password_type></request>'
    + '[' '!' -z ']'
    ++ curl --silent --request POST http://192.168.8.1/api/user/login --dump-header /tmp/headers.tmp -H 'Cookie: SessionID=' -H '__RequestVerificationToken: ' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data '<request><Username>admin</Username><Password></Password><password_type>4</password_type></request>'
    + RESPONSE='<?xml version="1.0" encoding="UTF-8"?>
    <error>
    <code>125002</code>
    <message></message>
    '/error>
    + ProcessRouterResponseHeader
    ++ cat /tmp/headers.tmp
    ++ grep '__RequestVerificationTokenone: '
    ++ awk '{print $2}'
    + NEWTOKEN=
    + '[' '!' -z '' ']'
    ++ cat /tmp/headers.tmp
    ++ grep '__RequestVerificationToken: '
    ++ awk '-F ' '{print $2}'
    + NEWTOKEN=
    + '[' '!' -z '' ']'
    ++ cat /tmp/headers.tmp
    ++ grep 'Set-Cookie: SessionID='
    ++ awk '-F ' '{print $2}'
    ++ cut -b 1-138
    + NEWSESSIONID=
    + '[' '!' -z '' ']'
    + echo

  • oga83oga83 Membre Messages: 1121
    ça ne pourra pas marcher sans programme pour générer le sha256...
    Sur mac, il me semble qu'on l'installe avec :
    brew install coreutils

  • FabLabFabLab Membre Messages: 13
    Alors là "je tombe de l'armoire"…

    En recherchant le premier script qui m'a permis de récupérer les données hors logging, je l'exécute tel quel (par reflex) et voit qu'il fonctionne, alors qu'il envoi un cryptage de type 1 (hash 256 seulement) et un mot de passe qui n'est pas le mien 0_o

    MODEM_IP="192.168.8.1"
    set echo off
    curl -s -X GET "http://$MODEM_IP/api/webserver/SesTokInfo" > ses_tok.xml
    
    COOKIE=`grep "SessionID=" ses_tok.xml | cut -b 10-147`
    TOKEN=`grep "TokInfo" ses_tok.xml | cut -b 10-41`
    # Login
    LOGIN_REQ="<request><Username>admin</Username><Password>YWRtaW4=</Password><password_type>3</password_type></request>"
    curl -X POST -d $LOGIN_REQ "http://$MODEM_IP/api/user/login" -H "Cookie: $COOKIE" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: text/xml" --dump-header login_resp_hdr.txt > /dev/null
    
    grep "SessionID=" login_resp_hdr.txt | cut -d ':' -f2 | cut -d ';' -f1 > session_id.txt
    grep "__RequestVerificationTokenone" login_resp_hdr.txt | cut -d ':' -f2 > token.txt
    
    SESSION_ID=`cat session_id.txt`
    TOKEN=`cat token.txt`
    
    echo "admin session_id\n$SESSION_ID\n"
    
    message_data='<request><dataswitch>0</dataswitch></request>'
    curl -X POST -d $message_data "http://$MODEM_IP/api/dialup/mobile-dataswitch" -H "Cookie: $SESSION_ID" -H "__RequestVerificationToken: $TOKEN\n" -H "Content-Type: text/xml" 
    #message_data='<request><Index>-1</Index><Phones><Phone>0605040302</Phone></Phones><Sca></Sca><Content>TEST</Content><Length>4</Length><Reserved>1</Reserved><Date>1</Date></request>'
    #echo $TOKEN
    #sleep 1
    #curl -X POST -d $message_data "http://$MODEM_IP/api/sms/send-sms" -H "Cookie: $SESSION_ID" -H "__RequestVerificationToken: $TOKEN\n" -H "Content-Type: text/xml" 

  • oga83oga83 Membre Messages: 1121
    Tu es probablement déjà loggué.
    Redémarre le routeur est ré-essaye.
  • oga83oga83 Membre Messages: 1121
    Le "brew install coreutils" a fonctionné ?
  • FabLabFabLab Membre Messages: 13
    Modifié (novembre 2020)
    oga83 a dit :
    Tu es probablement déjà loggué.
    Redémarre le routeur est ré-essaye.
    Je n'étais loggué avec aucun navigateur (5 minutes c'est court) et j'avais jamais réussi à me logguer sous bash.
    Après un redémarrage (au bonton, pas via l'interface), je peux encore activer ou non la connexion data. 
    Toujours avec un mot de passe qui n'est pas le mien…
    Si je modifie le mot de passe, il me renvoie une erreur 125002.

    Ce routeur à été débloqué par des chinois pour fonctionner sur tout opérateurs, peut-être il y a t-il une porte qui à été laissé ouverte.
    Si d'autres propriétaire de B315 pouvait faire l'essai…

    oga83 a dit :
    Le "brew install coreutils" a fonctionné ?
    bash-5.0 ~ $ brew install coreutils
    Updating Homebrew...
    ==> Auto-updated Homebrew!
    Updated 1 tap (homebrew/core).
    ==> New Formulae
    aerc              cfn-format        dog               glab              kube-linter       librttopo         php@7.4           utf8cpp           xkeyboardconfig
    aws-rotate-key    chars             easy-rsa          gopls             kubecm            libtirpc          regipy            v2ray             xorgrgb
    bpytop            checkov           evernote2md       gosec             lab               libxp             showkey           xbitmaps          xterm
    cairomm@1.14      clash             flux              gping             libbsd            mesa-glu          strace            xcb-util          youtubedr
    cargo-edit        condure           giza              kcgi              libcap            overdrive         tm                xinput
    ==> Updated Formulae
    Updated 4480 formulae.
    ==> Deleted Formulae
    confluent-platform   fmsx                 ori                  pgplot               rmtrash              stlviewer            unp64                xspin
    
    Warning: You are using macOS 10.13.
    We (and Apple) do not provide support for this old version.
    You will encounter build failures with some formulae.
    Please create pull requests instead of asking for help on Homebrew's GitHub,
    Twitter or any other official channels. You are responsible for resolving
    any issues you experience while you are running this
    old version.
    
    ==> Downloading https://homebrew.bintray.com/bottles/coreutils-8.32.high_sierra.bottle.1.tar.gz
    ==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/25c71d9d9a156cc8dfaa52b35dad1f9d49df55e97748fb5ab9522f65aeed4dca?response-content-disposition=attachment%3B
    ######################################################################## 100.0%
    ==> Pouring coreutils-8.32.high_sierra.bottle.1.tar.gz
    ==> Caveats
    Commands also provided by macOS have been installed with the prefix "g".
    If you need to use these commands with their normal names, you
    can add a "gnubin" directory to your PATH from your bashrc like:
      PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
    ==> Summary
    🍺  /usr/local/Cellar/coreutils/8.32: 476 files, 8.8MB
    Apparemment…
    10.13 une old version?… 😊

    Du coup sha256 et base64 devrait mieux fonctionner?


    Message edité par FabLab on
  • FabLabFabLab Membre Messages: 13
    Modifié (novembre 2020)
    Comment on enleve ce truc… 😊 


    J'ai refait un test de la commande sha256 après avoir installé coreutils, mais c'est toujours pareil.
    J'ai rééxécuté le script sendsms_huawei et j'ai la même réponse.

    'MonMotDePasse' crypté en sha256 puis en base64 puis coupé en 64 bits, ça me donne:
    NTZhZDgwNDg4MmExOGI2M2RjZTg3MjIyMTRmNTAwZTA1ZTlkOWViM2JlMjQ1NGVj

    Si je le vérifie ici, ça correspond… :-/
    https://coding.tools/fr/base64-encode

    Je vais essayer de remettre tout ça dans un curl POST.

    PS: j'ai dit une connerie en haut: YWRtaW4= correspond à un codage de 'admin' en base 64 et pas en sha256.
    Message edité par FabLab on
  • JibapJibap Membre Messages: 9
    Modifié (février 2022)
    Salut à tous, 

    Un grand merci à oga83 pour son script bash. 
    J'ai réalisé de fil en aiguille une petite appli Windows qui permets de gérer les SMS depuis la zone de notif, et surtout d'être notifié dès qu'un nouveau SMS est dans la boite !


                         







    Du coup je me suis dit que ça pourrait en intéresser d'autres... 

    Voilà le lien vers le projet : https://github.com/jibap/B525-SMSManager

    Pour l'instant j'ai fait du traitement global (suppression/marquage pour tous les SMS) mais une prochaine version (quand je trouverai le temps) permettra de faire les actions sur un seul SMS puis une V3 pour une sélection dans la liste...

    A+

    Message edité par Jibap on
  • JacquesFJacquesF Membre Messages: 11
    Bonjour,

    J'ai créé à partir des scripts déjà réalisés par @oga83 (partie connexion) et @Jibap (partie SMS) un outil utilisable sous Linux (et probablement Mac, Windows en installant bash) qui permet de réaliser diverses actions sur les SMS.
    Ce script fonctionne sur mon routeur B535-333 et devrait fonctionner avec tous les routeurs utilisant la même API.

    Le code a été amélioré pour éviter au maximum les appels de programmes externes et apporte plus de souplesse dans l'utilisation. Une amélioration notable est la possibilité d'envoyer un même SMS à plusieurs téléphones en même temps (en indiquant une liste de numéro séparés par un ';').

    Les données de connexion peuvent être indiquées en ligne de commande et remplacent en ce cas celles qui peuvent être lues dans le fichier de configuration. Il est possible de spécifier un autre fichier de config pour le cas où l'on gère plusieurs routeurs.

    Un mode debug est prévu permettant soit d'afficher les données reçues en brut, sans aucun traitement, ou d'indiquer le traitement effectué avec les paramètres reçus.

    Les actions possibles sur les SMS sont :
    - Afficher le nombre de SMS dans une boîte précise ou toutes les boîtes
    - Effacer un SMS précis ou tous les SMS d'un coup dans une des boîtes Inbox ou Outbox
    - Afficher le contenu des SMS présents dans une de ces boîtes
    - Marquer tous les SMS reçus comme lus
    - Envoyer un SMS à un ou plusieurs correspondants à la fois

    En principe, l'interface sera en français si cette langue est configurée sur la machine, sinon les messages seront affichés en anglais. La langue peut être forcée en ligne de commande et il est facile de rajouter une traduction si nécessaire.

    En espérant qu'il puisse vous être utile.

    Jacques
  • Lantenac44Lantenac44 Membre Messages: 3
    Modifié (janvier 2023)

    Bonjour Jacques,

    Ou pouvons nous charger votre script/programme ?

    Je suis intéressé pour faire des tests, et utiliser le router en envoi de SMS via un ERP, qui générera des envois de SMS en ligne de commande 😅

  • JibapJibap Membre Messages: 9
    Modifié (20 févr. 01:06)

    Petit message pour informer d'une mise à jour de mon petit programme auquel j'ai ajouté 2 nouveautés :

    1 - Ajout d'une liste de contacts dans le fichier de config, ce qui permets d'afficher un label (nom, prénom ou tout ce qu'on veut) à la place du numéro de téléphone


    2 - Ajout d'un interrupteur rapide dans le menu de la zone de notification et bouton dans l'interface permettant d'activer ou désactiver le wifi directement en un clic !

    J'en ai également profité pour modifier le comportement de l'infobulle de Windows, au lieu d'une seule notif avec plusieurs extraits de chaque SMS, chaque SMS a sa propre notif, ce qui permets de voir plus du message...

Connectez-vous ou Inscrivez-vous pour répondre.