Envoi de SMS avec GAMMU et php

Bonjour à tous,

J’ai suivi quelques tutos pour installer Gammu avec une clé Huawei.
J’ai réussi sans trop de problèmes à envoyer des SMS via mon PI4 en ligne de commande comme ceci :

/usr/bin/sudo /bin/echo -e test | /usr/bin/gammu -c /var/www/gammu/.gammurc --sendsms TEXT ********

Le problème est que maintenant, je veux pouvoir appeler ce script via une page php depuis mon réseau local tel que : http://ip_du_pi/sms.php?texte=&telephone=

L’envoi du SMS fonctionne bien, mais Gammu ne récupère pas le texte à envoyer, j’obtiens le message : « no chars found » et je reçois un sms vide…

Voici ma page PHP :

<?php
	shell_exec('/usr/bin/sudo /bin/echo -e test | /usr/bin/gammu -c /var/www/gammu/.gammurc --sendsms TEXT ********');
?>

J’ai essayé de modifier l’encodage de la page, la commande shell_exec, … je ne comprends pas, si je colle ça en local dans ma console ça fonctionne mais via PHP, le message est vide…
Pouvez-vous m’aider ?
Merci d’avance

Bonjour,

1 - Je ne vois pas bien l’intérêt de

/usr/bin/sudo /bin/echo -e test

2 - Au hasard, essayer d’ajouter des doubles quottes autour du texte.

A+

Merci pour ta réponse,
Si tu parles de l’option « -e » c’est parce qu’à la base, j’avais un texte en variable avec des retour charriots que j’ai enlevé pour tester…
J’ai essayé avec des quotes oui…

hello,

avec ce code j’arrive a envoyer un sms depuis un serveur nginx + php-fpm
`

<?php $message = "All your base are belong to us 2"; $tel = "+33123456789"; $config="/var/www/html/smsd/gammurc"; $send_line = shell_exec('echo "'.$message.'"|gammu -c '.$config.' sendsms TEXT "'.$tel.'"'); sleep(10); echo "$send_line \n"; ?>

`
NB: mon gammurc et le gammu.log sont ds le meme repertoire que le fichier php

j’utilise /dev/ttyS0 qui resemble à ça:
crw-rw---- 1 root dialout 4, 64 févr. 7 17:40 /dev/ttyS0
par contre je comprends pas comment j’ai pas de problème de droit ! mais bon :wink:
peut être parce que j’ai ajouter ça ds /etc/group …
dialout:x:20:pi,gammu,www-data

Merci pour ta réponse !
Déjà ce que je souhaite faire à l’air possible :slight_smile:
Je vais essayer avec ton code php mais je ne vois pas vraiment de différence avec le mien…
J’ai également ajouté le compte dans le groupe qui va bien, et aussi ajouté la possibilité d’exécuter gammu avec les droits root dans sudoers.
Ce que je ne comprends vraiment pas c’est que je mets strictement la même commande dans la console et ça marche… c’est donc forcément le passage par php qui pose problème.
Ça ne peut pas venir d’un souci de droit ou de conf, vu que je reçois bien le sms via php…
Je ne vois qu’un souci d’encodage !?
Les Logs sont trop obscurs je comprends rien :slight_smile:
Bref, si quelqu’un a une idée, je désespère !

Bonjour,

Dans cet article, plusieurs autres pistes. Utiliser exec plutôt que shellexec, noter qu’il y a des simples quottes un peu partout. Installer utiliser gammu-smsd, ce qui donne 2 nouvelles syntaxes, l’une avec le echo pipe et l’autre avec le texte à la fin.

https://wiki.maxcorp.org/installer-gammu-et-gammu-smsd-pour-envoyer-des-sms-depuis-un-raspberry/

A+

Finalement après de multiples essais, j’ai réussi en enlevant le sudo devant le lancement… je ne comprends pas vraiment pourquoi techniquement mais bon.
J’avais déjà vu cet article très interessant et me voilà finalement confronté à ce souci d’encodage…
Le script a pour but d’envoyer son mot de passe à un utilisateur (entre autre) et le souci c’est que dans l’URL il peut y avoir n’importe quel caractère appart des quotes. J’ai l’impression que ça pose souci à l’envoi. Le Caractère $ dans le mot de passe par exemple ne passe pas.
Pourtant, dans mon url, j’utilise urlencode pour encoder le message avant l’envoi.

si tu utilise la méthode POST a la place de la méthode GET ça doit solutionner ton problème.
exemple en source.

source:https://www.php.net/manual/fr/tutorial.forms.php

Je vais tester ça c’est une très bonne idée !

Édit : Après réflexion, je suis pas sur.
Comme mon url est encodée, le dollar l’est aussi c’est pas tant le passage à php qui pose problème mais plutôt l’exécution de shell_exec je pense.
Je vais tester en post mais je pense que le mieux sera d’échapper le caractère $ en rajoutant un \ devant ?

Effectivement, POST ne change rien, mais l’escape de $ fait le job !!!

$texte = str_replace ('$', '\$', $_GET['texte']);

Merci à tous !

Ah, tu tombes plutôt bien, quand il s’agit d’envoyer des SMS avec Gammu via PHP depuis une Raspberry Pi je pense qu’on est un peu parmi les experts ! Regarde https://raspisms.raspberry-pi.fr !

Alors attention avec le code qui t’as été proposé, tu as une failles de sécurité majeure ! Un attaquant pourrais exécuter du code arbitrairement sur la machine via une injection dans shell_exec en passant par $_GET[‹ texte ›] !

Pour faire ça correctement il faut que tu utilises la fonction escapeshellarg() de PHP !

Voici donc le code :

<?php
        $message = $_GET['texte'];
        $message = escapeshellarg($message);

        $message_len = mb_strlen($message);

    	$destination = '+33623456789';

    	$command = 'gammu sendsms TEXT 	' . $destination . ' -text ' . $message . ' -autolen ' . $message_len;

    	//Uncomment to run command asychronously
    	//$command .= ' /dev/null 2>&1';

    	$return = shell_exec($command);

    	echo "Return : \n";
    	echo "-------- \n";
    	echo $return . "\n";

Par ailleurs, quelques infos :

  1. Si ton sudo ne fonctionne pas c’est pour plusieurs raisons. Il faudrait que Apache ai les droits sudo, et c’est pas une bonne idée. Il faudrait qu’il puisse lancer un script sudo sans mot de passe. Et c’est encore moins une bonne idée. Les deux sont des portes ouvertes niveau sécu.
  2. Si ton $ passe pas c’est justement parce-que c’est un caractère spécial en bash (une variable). Donc en utilisant escapeshellarg, plus besoin de l’échapper.

Merci pour ton aide !!

Du coup le seul caractère qui ne passe pas avec escapeshellarg c’est le tilde (~) il est supprimé dans le message, ça vient de mon php ou de gammu ?

Salut,
À priori escapeshellarg ne fait rien de particulier au caractère ~ en dehors de lui mettre des guillemets qui devraient donc le laisser tel quel dans le sms.
Essai la réponse proposée ici pour voir https://stackoverflow.com/questions/51048762/gammu-sms-in-arabic-using-php-does-not-be-delivered/51078770#51078770

Merci pour la piste, mais même avec cette commande, il est supprimé, le souci vient bien de gammu (commande collée dans la console UNIX directement).
On va dire que ce n’est pas très grave.
J’ai aussi un petit souci de latence, quand j’envoie un SMS en ligne de commande, ça peut prendre plusieurs minutes des fois (quand je n’ai pas envoyé de SMS depuis longtemps).
Dès que j’en renvois un dans la foulée, ça fonctionne ! Est-ce que c’est « juste » un espèce de mode hibernage ?
Merci encore