#1 Le 25/12/2015, à 12:28
- meaz
Exécuter un script sh depuis php avec sudo
Bonjour,
j'ai créé un script copyfolderuploads.sh:
#!/bin/sh
sudo cp -r /var/www/html/upload/uploads /media/cleusb
et je l'ai mis dans le dossier /var/www/html/upload
Cela copie le dossier "Uploads" sur une clé usb. Cela marche quand je l'exécute depuis le terminal.
Cependant, mon objectif est de créer une page d'administration, de façon à ce que lorsque je suis connecté à mon serveur (un raspberry pi 2), je puisse exécuter le script depuis une page php.
J'ai fait ce script php (grâce à des recherches sur internet car je débute...) que j'ai appelé test.php
<?php
if(isset($_POST['exec']))
{
if(isset($_GET['action']) && $_GET['action'] == 'yes')
{
$cmd = exec(escapeshellcmd('sudo /var/www/html/copyfolderuploads.sh'));
if($cmd)
{
echo 'Copie terminée';
}
else
{
echo 'La copie n\'a pas fonctionnée';
}
}
}
echo '<form method="post" action="test.php?action=yes">
<input type="submit" name="exec" value="Executer" >
</form>';
?>
Mais quand je clique sur le bouton, j'ai le message "La copie n'a pas fonctionnée", et effectivement, quand je fais un ls pour voir le contenu de la clé, les fichiers n'ont pas été copiés.
Ma question est double:
1- Est-ce que mon script php est bon? Peut-être le problème vient de lui?
2- De ce que j'ai compris par mes recherches, le problème peut aussi venir du fait que mon script doit s'exécuter avec des droits root.
Bref, je suis perdu!
Je vous remercie pas avance pour votre aide.
Cordialement
PS: j'ai aussi testé ceci, qui ne marche pas non plus:
<?php
if(isset($_POST['exec']))
{
if(isset($_GET['action']) && $_GET['action'] == 'yes')
{
$cmd = exec(escapeshellcmd('cp -r /var/www/html/upload/uploads /media/cleusb'));
if($cmd)
{
echo 'Copie terminée';
}
else
{
echo 'La copie n\'a pas fonctionnée';
}
}
}
echo '<form method="post" action="test.php?action=yes">
<input type="submit" name="exec" value="Executer" >
</form>';
?>
Hors ligne
#2 Le 25/12/2015, à 12:43
- tiramiseb
Re : Exécuter un script sh depuis php avec sudo
Salut,
L'utilisateur sous lequel fonctionne PHP (a priori www-data) a-t-il le droit d'exécuter ce script avec sudo, sans mot de passe ?
Attention, la seconde forme est dangereuse : je te conseille plutôt de faire appel à ton script et de n'autoriser cet utilisateur qu'à exécuter ce script en particulier. sinon un attaquant pourrait détourner cette autorisation pour te pirater...
Bien sûr, ce script ne doit pas appartenir à www-data et ne doit pas pouvoir être modifié par lui.
Dernière modification par tiramiseb (Le 25/12/2015, à 12:44)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#3 Le 25/12/2015, à 16:21
- meaz
Re : Exécuter un script sh depuis php avec sudo
Bonjour,
j'ai fait ça
chown www-data:www-data /var/www/html/upload/test.php
et
chown www-data:www-data /var/www/html/upload/copyfolderuploads.sh
Les deux fichiers ont des permissions d'exécution (755).
J'ai aussi fait ça:
sudo visudo
et j'ai rajouté cette ligne
www-data ALL=(ALL) NOPASSWD:ALL
Je sais que c'est pas sécurisé, mais c'est pour tester.
Mais cela ne marche pas...
Hors ligne
#4 Le 25/12/2015, à 16:24
- tiramiseb
Re : Exécuter un script sh depuis php avec sudo
Je sais que c'est pas sécurisé, mais c'est pour tester.
Ouais il vaut mieux, car là n'importe qui peut faire n'importe quoi sur ton serveur rien qu'en visitant ton site web et en exploitant la moindre minuscule faille...
Concernant le "chown", ce n'est pas nécessaire ; le droit dans sudo est nécessaire par contre.
Il faut dans ce cas voir s'il y a des traces de debug de PHP, peut-être dans les logs d'Apache..
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 25/12/2015, à 23:09
- meaz
Re : Exécuter un script sh depuis php avec sudo
J'avance un peu...
le script de mon premier post ne marche pas... Donc j'ai fait simple: un fichier php intitulé "test.php"
<?php
exec("/var/www/html/upload/copyfolderuploads.sh");
?>
Ensuite, je fais
sudo visudo
et
www-data ALL=(ALL) NOPASSWD:ALL
Ca fonctionne.
Mais si je change
www-data ALL=(ALL) NOPASSWD:ALL
par
www-data ALL=(ALL) NOPASSWD: /var/www/html/upload/copyfolderuploads.sh
Ca ne marche plus.
Qu'est-ce que j'oublie de faire?
Merci beaucoup
Hors ligne
#6 Le 26/12/2015, à 00:13
- tiramiseb
Re : Exécuter un script sh depuis php avec sudo
Qu'est-ce que j'oublie de faire?
Le "sudo", tu dois le mettre "autour" de ton script et pas dedans. Là tu as configuré sudo pour lui dire « autorise l'exécution du script en tant que root » et en réalité ce que tu essaye de faire c'est exécuter le script et dedans, faire un cp en tant que root. Ce n'est pas la même chose.
==>
exec("sudo /var/www/html/upload/copyfolderuploads.sh");
... et tu peux enlever le "sudo" dans le script.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 26/12/2015, à 17:28
- meaz
Re : Exécuter un script sh depuis php avec sudo
Bonjour,
merci pour vos réponses. Cela ne marche plus du tout. J'ai tout effacé et repris depuis le début:
Dans mon dossier /var/www/html/upload, j'ai deux dossiers:
- Un dossier "uploads"
- Un dossier "test"
Je veux copier le contenu de "uploads" dans "test"
J'ai donc deux scripts:
le script copyfolderuploads.sh
#!/bin/sh
cp -r /var/www/html/upload/uploads /var/www/html/upload/test
le fichier copy.php qui appelle le script ci-dessus:
<?php
exec('sudo /var/www/html/upload/copyfolderuploads.sh');
?>
(d'ailleurs c'est exec('sudo ....) ou exec("sudo...) ?
J'ai donné des droits 755 au script sh.
Puis j'ai fait:
sudo visudo
# User privilege specification
www-data ALL=(ALL) NOPASSWD:/var/www/html/upload/copyfolderuploads.sh
Mais cela ne marche pas...
J'ai changé en mettant :
www-data ALL=(ALL) NOPASSWD:ALL
Mais cela ne marche pas non plus! Je suis vraiment bloqué!
Merci pour votre aide!
Dernière modification par meaz (Le 26/12/2015, à 17:34)
Hors ligne
#8 Le 26/12/2015, à 17:49
- tiramiseb
Re : Exécuter un script sh depuis php avec sudo
Mais cela ne marche pas
Qu'y a-t-il dans les logs ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#9 Le 26/12/2015, à 17:59
- meaz
Re : Exécuter un script sh depuis php avec sudo
Bonjour,
voici le message dans les logs d'error :
sudo: unable to execute /var/www/html/upload/copyfolderuploads.sh: No such file$
Je ne comprends pas car copyfolderuploads.sh existe bien dans /var/www/html/upload/
D'ailleurs quand je fais :
sudo /var/www/html/upload/copyfolderuploads.sh
ça fonctionne... Donc le script est ok.
J'ai testé :
sudo -u www-data /var/www/html/upload/copyfolderuploads.sh
J'obtiens le message:
cp: cannot create directory ‘/var/www/html/upload/test/uploads’: Permission denied
J'aurais jamais cru que c'était si difficile de faire fonctionné un script depuis php...:D
Hors ligne
#10 Le 26/12/2015, à 18:53
- meaz
Re : Exécuter un script sh depuis php avec sudo
C'est bon j'ai réussi!
Sur
<?php
exec('sudo /var/www/html/upload/copyfolderuploads.sh');
?>
Il fallait mettre des doubles quotes, donc plutôt:
<?php
exec("sudo /var/www/html/upload/copyfolderuploads.sh");
?>
Hors ligne
#11 Le 26/12/2015, à 19:23
- tiramiseb
Re : Exécuter un script sh depuis php avec sudo
Pourtant, dans ce cas précis, le type de guillemet ne devrait pas avoir d'impact...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne