Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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)

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..

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.

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 ?

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...

Hors ligne