Comment lancer une commande linux depuis un script PHP

Bonjour je souhaiterais exécuter cette commande (envoi d’un SMS avec GAMMU) :
gammu sendsms TEXT « $Telephone » -text « $TITLE » avec $Telephone=« 0612345678 » et $TITLE =« essai »
depuis l’invite de commande ou un script /bin/sh cela fonctionne nickel.
Mais j’aurais besoin d’envoyer un SMS depuis un script PHP et là ben je n’y arrive pas, j’ai essayé pas mal de choses sans grand succès… Du genre shell-exec, exec, séparer la commande gammu sendsms… dans un fichier script et l’appeler depuis mon script php,…

Quelqu’un saurait-il comment résoudre ce problème?
Merci

Le problème est souvent une question d’autorisation utilisateur.

Si la commande demande un accès root ou sudo, ou que certains paramètre de chemin sont critique, il ce peut que la commande ne marche pas.

Le log de ton serveur Web devrais te donner des informations.

Les solutions tournent autour de la gestion des autorisation de la commande/fichier, des droits d’accès (chmod) et les droit d’actions et d’accès de l’utilisateur utilisé par le serveur web, par exemple Apache peux utiliser « www-data » comme utilisateur.

SI tu veux exécuter des commandes qui exigentt un root ou sudo, il faut faire attention, donner l’accès du compte du serveur Web a certains commandes peut rendre vulnérable le serveur à des attaques et des prises de contrôles.

Tu peux créer une alernative simple et plus sécuritaire ou tu as un formulaire pour envoyer ta demande, ce dernier sert a créer un enregistrement soit dans un fichier ou dans une base de données, et un script avec les autorisations vient vérifier la présence de la demande, la traite et efface la demande. Ce script peut être un script PHP qui est en boucle, ou un appel via un Cron pour exécuter une commande en PHP, ou autres langage. Ce process peu alors être dans un autre utilisateur que le serveur Web et contenir des consigne précise, rendant tes demande plus sécuritaire.

Bonjour, merci pour cette piste!
Je viens de vérifier actuellement je suis connecté en pi et les commandes :
echo -e « $TITLE $TEXT » | gammu -c /home/pi/.gammurc sendsms TEXT « $Telephone »
et
gammu sendsms TEXT « $Telephone » -text « $TITLE »
passent très bien depuis l’invite de commande et depuis le script.

Sinon pour ton idée j’avoue être plutôt débutant, si j’ai bien compris tu proposes de séparer le code PHP et dans celui-ci de passer la main à un script qui gérerait l’envoi du SMS.
Est-ce bien cela?

Si oui, j’ai déjà un script qui envoie des SMS, mais je n’arrive pas à le lancer depuis PHP…
Merci

Quand tu es sous terminal ou en ssh, tu es en utilisateur « pi », il peut en autres utiliser le « bash », l’un des support pour lancer des commandes.

L’utilisateur du serveur Web Apache, utilise « www-data » ou « apache », ce dernier à une interdiction de login, ce qui veux dire qui ne peut ni accéder au terminal ou via le ssh si un « humain » déciderais de l’utiliser, dans le cas ici, il inerdit a l’application de ce connecter en tant qu’utilisateur. Par la suite, tu as le support de commande qui est limité, il n’est pas sur le bash, il ne peut donc pas exécuter des scripts.

J’utilise ma solution avec mon serveur pour lancer des fermetures ou redémarrage du système.

L’idée est de créer un formulaire, moi j’utilise mon CMS perso et je fais un appel en Ajax sur le script. Ce script permet de créer une demande d’action. Apache/PHP arrive à écrire un fichier sans problème.

Par la suite, tu crée un cron job a tout les minutes, (il aurais aussi moyen de charger une commande en script de démarrage qui surveille la création/modification d’un fichier et exécute une commande si ça arrive, mais je n’ai pas cherché à l’exploitter), il va lancer le même scrip, mais sous l’utilisateur « pi » dans ton cas, il va vérifier si une demande est fait, si oui, la consulte et exécute la commande requise.

Je te fournis mon code pour t’aider. (Je code mes textes en anglais dans mes scripts de base, évite des problème par les caractères spéciaux sous certaines consoles de commandes/navigateur)

Ce code est très basique est ne doit pas être accessible de l’extérieur (Internet), il y a aucune sécurité.

Tu dois faire une demande via fichier.php?a=action-désiré[&v=valeur]

Tu dois vérifier avec la commande php fichier.php check

Le fichier « action.rq » est créé dans le même dossier que le fichier du script.

<?php
	error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED);
	ini_set("display_errors", 1);
	
	function writeAction($act,$value=false){
		echo "<pre>";
		if($fp = fopen(dirname(__FILE__)."/action.rq", 'w+')){
			fwrite($fp, "<?php \$makeAction=\"".$act."\";".(($value!==false)?" \$makeValue=\"".$value."\";":""));
			fclose($fp);	
			echo "Requesting a ".$act." with success.\n";
		}
		else echo "Error to write in ".dirname(__FILE__)."/action.rq, action ".$act." can't be requested.\n";
		echo "</pre>";
	}	
	if($argv[1]) $action=$argv[1];
	else $action=$_GET['a'];
	if($argv[2]) $value=$argv[2];
	else $value=$_GET['v'];
	switch($action){
		case 'nopower':
		case 'shutdown':
			writeAction("shutdown",$value);
			break;
		case 'reboot':
			writeAction("reboot");
			break;			
		case 'powerback':
		case 'cancel':
			writeAction("cancel");
			break;
		case 'check':
			if(file_exists(dirname(__FILE__)."/action.rq")){
				echo "Action request found...\n";
				require(dirname(__FILE__)."/action.rq");
				@unlink(dirname(__FILE__)."/action.rq");
				echo "Requested: ".$makeAction.", trying...\n";
				if($makeAction=="shutdown") {
					if(!is_numeric($makeValue) || $makeValue<=0) $time=10; //default
					else $time=$makeValue;
					echo "Shutdown in ".$time."mins...\n";
					echo system("/sbin/shutdown -P +".$time." 1>/dev/null")."\n";
					echo "Done\n";
				}
				else if($makeAction=="reboot") {
					echo "Reboot now...\n";
					echo system("/sbin/shutdown -r now 1>/dev/null")."\n";
					echo "Done\n";
				}				
				else if($makeAction=="cancel") {
					echo "Cancel shutdown...\n";
					echo system("/sbin/shutdown -c 1>/dev/null")."\n";
					echo "Done\n";
				}
				else {
					echo "Error, action invalid.\n";
				}
			}
			else echo "PDone\n";
			break;
		default:
			echo "Invalid action\n";
	}

Ok merci. Je vais essayer de décoder tout cela! Et je te dirais si j’arrive à le faire" fonctionner".
merci
encore

Bon j’ai regardé c’est assez loin de mon niveau…
Peux-tu stp détailler un peu plus ce que tu appelles :

Tu dois faire une demande via fichier.php?a=action-désiré[&v=valeur]
et
Tu dois vérifier avec la commande php fichier.php check
Merci

Le fichier s’appelle via une URL ou une ligne de commande.

Alors tu place le fichier dans le dossier du serveur Web, tu appels alors le script.

La première ligne est pour créer la demande, tu défini l’action et si il y a lieu, la valeur. http://ip-ou-host-du-rpi-server-we/fichier.php

La seconde ligne est pour passer en ligne de commande, elle permet de vérifier si une demande d’action est en attente et exécute selon la demande.

Merci pour tout j’ai trouvé ceci qui fonctionne presque nickel :
$Telephone=« 06712345678 »;

$message5="probleme_de_reception_donnees_ruches";

$commande = "gammu sendsms TEXT ".$Telephone." -text ".$message5;//création de la ligne de commande

$send_line = shell_exec($commande);//envoi du SMS

Pour le moment je ne peux pas avoir d’espace (pas d’envoi du SMS), ni de 'accents (message tronqué à partir du 1er accent…)

Par contre il a fallut que je modifie mes droits d’accès sur le Raspberry :

Il faut veiller à ce que l’utilisateur du dameon apache 'www-data" sur raspbian ait

le droit de faire tout ce qu’il a à faire

Entre autre, pour gammu, il faut qu’il appartienne au group dialout

sudo usermod -a -G dialout www-data

Que gammu soit exécutable par les membres du group

sudo chmod 755 /usr/bin/gammu

(2ième chiffre : 5 = droits des membres du groupe et 5 = 4+1, 4 = Read, 1 = Execute)

Merci
Correction pour les espaces :

$commande = « gammu sendsms TEXT « .$telephone. » -text «  ».$message. »"";
le " pour insérer le " dans la chaine.
Pour les accents c’est un problème de fichier de configuratio de Gammu dans lequel (enfin je vais vérifier il faut mettre GammuLoc=fr_FR.UTF8.
Merci

$commande = "gammu sendsms TEXT ".$Telephone." -text \"".$message5."\" ";
Je pense que là c’est plus lisible…

Si jamais tu veux pas te prendre la tête ya aussi une autre solution : GitHub - RaspbianFrance/raspisms: RaspiSMS est un système de gestion et d'envoi de SMS par ordinateur, initialement conçu pour les Raspberry Pi

Et si tu veux faire le code toi même tu peux jeter un oeil pour voir comment construire une commande bash correctement en PHP, notamment en évitant les failles de sécurité : https://github.com/RaspbianFrance/raspisms/blob/ad1f798ae6019bed3ff369d25dca90e7af1c88ea/adapters/GammuAdapter.php#L174

Meri pour le conseil, mais raspisms c’est payant…
Sauf en version auto hébergement mais celle-ci ne fonctionne pas sur téléphone Android (ce qui est la majorité des téléphones et en tout cas les miens…)

Par contre le 2eme lien pour créer une commande bash en php me parait très intéressant.
Merci encore