Bonjour.
Aprés avoir configuré un petit serveur de jeu j'ai pensé a une petite interface web qui lancerais les commandes sur le vps ou sont le site web et les fichiers .sh
Voici mon code :
if (isset($_GET['startproxy']) && empty($_GET['startproxy'])) {
exec('./home/Proxy.sh start');
//header('Location: index.php');
}
if (isset($_GET['stopproxy']) && empty($_GET['stopproxy'])) {
exec('./home/Proxy.sh stop');
//header('Location: index.php');
}
Le fichier a l'air de se lancer mais le contenu du fichier n'est pas éxécuté.
Merci de votre aide
Bonsoir,
On part du principe que ton script sh fonctionne correctement quand tu le lances en root depuis ton serveur et que ton os est un ubuntu ou une debian. (Si RedHat / Centos certains éléments changent)
Je te propose d'essayer 2 approches. Si la première ne marche pas tu passes à la seconde.
Solution 1 :
Tu modifies ton script php par ceci
if (isset($_GET['startproxy']) && empty($_GET['startproxy'])) {
exec('sh /home/Proxy.sh start');
}
if (isset($_GET['stopproxy']) && empty($_GET['stopproxy'])) {
exec('sh /home/Proxy.sh stop');
}
Solution 2
Si la première modification ne marche c'est peut-être parce que ton script sh ne peut être executé qu'en root. Or, dans ton cas c'est l'utilisateur d'apache qui va executer ton script, à savoir sur ubuntu : www-data. (apache sur centos)
Il faut donc donner le droit à l'utilisateur apache d'executer cette action. Pour cela il faut modifier le fichier sudoers. Pour cela tu entres la commande en root sur le serveur :
visudo
Le fichier /etc/sudoers va s'ouvrir et tu devrais y trouver une ligne : root ALL=(ALL) ALL.
Sous cette ligne on va ajouter une autorisation pour www-data sur ton script.
Tu ajoutes :
www-data ALL=(ALL) NOPASSWD: APACHEOK
Cmnd_Alias APACHEOK = /home/Proxy.sh
Tu enregistres et tu quittes l'éditeur.
Puis tu modifies ton fichier php pour qu'il ressemble à ça :
if (isset($_GET['startproxy']) && empty($_GET['startproxy'])) {
exec(' sudo /home/Proxy.sh start');
}
if (isset($_GET['stopproxy']) && empty($_GET['stopproxy'])) {
exec('sudo /home/Proxy.sh stop');
}
Apache a désormais le droit de lancer ton script sh.
A voir si cela résout ton problème.
Bonne soirée
Bonjour,
ces deux liens te serviront certainement ;)
http://stackoverflow.com/questions/28655095/how-to-execute-sh-file-with-php-via-website
http://stackoverflow.com/questions/7397672/how-to-run-a-sh-file-from-php
Salut,
Aussi, c'est plus safe d'utiliser un lien absolu, pour ne pas avoir de problème de lien relatif si tu bouges ton code.
Bonjour,
Pourrais-tu nous communiquer le contenu de ton script sh afin de pouvoir comprendre ton problème.
Quelques questions également :
Le repertoire /home contenant ton script est-il le répertoire /home à la racine du système de fichiers ou un repertoire home que tu as créé toi même dans l'arboresence ?
Quels sont les droits et les propriétaires du fichier sh ? Communiques nous le résultat de cette commande :
ls -l /home/Proxy.sh
Bonne journée
Un truc tout bête, c'est les 'fin de ligne', les sh ne supportent que les LF
donc à vérifier si on a édité le fichier sous Windows
@tpinforet
Voici le contenu du fichier Proxy.sh :
#!/bin/bash
SCREEN="Proxy" # nom utilis▒ pour le screen
NAME="BungeeCord Proxy" # nom du serveur, uniquement pour l'affichage des messages
COMMAND="java -jar -Xincgc -Xms1G -Xmx1G BungeeCord.jar" # commande de lancement du serveur
cd /home/minecraft/Proxy/ # emplacement du serveur
running(){
if ! screen -list | grep -q "$SCREEN"
then
return 1
else
return 0
fi
}
case "$1" in
start)
if ( running )
then
echo "Server [$NAME] is already running"
else
echo "Starting server [$NAME]"
screen -dmS $SCREEN $COMMAND
fi
;;
status)
if ( running )
then
echo "Running"
else
echo "Not running"
fi
;;
screen)
screen -r $SCREEN
;;
reload)
screen -S $SCREEN -p 0 -X stuff `printf "greload\r"`
;;
stop)
if ( running )
then
screen -S $SCREEN -p 0 -X stuff `printf "end\r"`
echo "Stopping server [$NAME]"
else
echo "Server [$NAME] is not running"
fi
;;
*)
echo "Usage : {start|stop|status|screen|reload}"
exit 1
;;
esac
exit 0
*Oui il s'agit du dossier home a la racine
*Le fichier sh a les droits 777
@tpin
Merçi tout fonctionne juste une derniere question si j'ai plusieurs fichiers sh a autoriser je peut entrer :
www-data ALL=(ALL) NOPASSWD: APACHEOK
Cmnd_Alias APACHEOK = /home/Proxy.sh
Cmnd_Alias APACHEOK = /home/Lobby.sh
Cmnd_Alias APACHEOK = /home/1v1.sh
Cmnd_Alias APACHEOK = /home/FFA.sh
Il est étrange que tu soit obligé de lancer bungee en root c'est même plutôt dangereux. Si tu a le temps de faire d'autres tests je te conseille plutôt de chmod +x (ou de chown le dossier à www-data) aussi le .jar car il peut bloquer le démarrage si il n'as pas les droits.
@Intertoxx
Il faut séparer tes commandes à autoriser par une virgule à savoir : /home/Proxy.sh,/home/Lobby.sh... etc
Par contre vérifie avant si ton script sh a besoin de sudo pour s'executer. Si oui alors tu le rentres dans ta liste.
@Uneo7
Dans son cas il ne lance pas de commande en root il autorise un utilisateur non root, à savoir www-data, à executer une commande. C'est-à-dire utiliser sudo sans devoir saisir le code pour un utilisateur donné. En outre Apache a déjà les droits d'execution sur le fichier sinon il ne pourrait pas l'executer.
Par contre un élément que je n'ai pas évoqué dans mon précédent message c'est qu'il n'est pas conseillé de laisser des droits à 777. Il faut que le groupe propriétaire du répertoire contenant le site soit www-data et fixer les droits à 750. Ainsi apache pourra lire et exécuter les fichiers avec les droits du groupe. Tu réserves le 770 seulement au répertoire ou fichier où apache doit écrire, par exemple un répertoire tmp ou img si tu uploads des images via ton interface web.
L'important c'est qu'il n'y ait pas de permissions publiques. (0)
Bonne soirée