2016-11-03 3 views
1

J'essaie de lancer un script bash plus tard en PHP, donc je l'ai laissé dans visudo.Démarrer un script bash plus tard en PHP

www-data ALL = (root) NOPASSWD: /sbin/iptables 
www-data ALL = (root) NOPASSWD: /usr/bin/at 

Le script removeuserIP fait exactement sudo iptables ... et travaille:

#!/bin/bash 
sudo iptables -t nat -D PREROUTING -s $1 -j ACCEPT; 
sudo iptables -D FORWARD -s $1 -j ACCEPT; 

et dans le code PHP, je mets cette ligne:

$msg=exec("echo /var/www/scripts/removeuserIP $ipaddress | at now + 1 minutes"); 

mais la question est ça commence le script maintenant. J'ai vérifié dans /log/var/auth.log et en effet, il commence la commande maintenant.

Je l'ai essayé dans un terminal directement et il n'y avait pas de problème, il commence plus tard (avec un argument bien sûr):

echo /var/www/scripts/removeuserIP $ipaddress | at now + 1 minutes 

J'ai aussi essayé de le faire comme celui-ci dans un terminal, mais celui-ci ne fonctionne pas trop parce qu'il ne comprend pas qu'il y ait un argument pour le fichier:

sudo at now +1 minutes -f /var/www/scripts/removeuserIP 172.24.1.115 

Je ne comprends vraiment pas pourquoi il commence dès maintenant, même si elle devrait commencer à 1 minute plus tard et pas maintenant.

+0

S'il vous plaît essayer 'exec ('echo"/var/www/scripts/removeuserIP $ ipaddress "| maintenant + 1 minutes"; '(notez les guillemets). Cela pourrait aider, même si je ne suis pas sûr. Si c'est le cas, je l'afficherai comme réponse. –

+0

Mettre www-data dans sudoers est l'une des pires idées. –

+0

J'ai essayé comme vous l'avez dit et ça ne marche toujours pas. Je viens de vérifier le journal et il semble qu'il n'a pas la permission d'utiliser à, vu dans/var/log/apache2 J'ai même essayé de visudo: www-data ALL = (tous) NOPASSWD: ALL et il dit toujours non permission d'utiliser à. Pourquoi est-ce l'une des pires idées? Toute autre suggestion pour faire quelque chose de plus sécurisé? Pour être honnête je suis un débutant avec apache2/php donc je ne suis pas surpris de ta réponse. – Peter

Répondre

0

Solution: Enfin, après avoir vérifié /var/log/apache2/error.log, je vis qu'il n'a pas l'autorisation d'utiliser à.

En fait vous devez aller /etc/at.deny et supprimer la ligne www-date avec at. Il y a probablement une raison de sécurité pour laquelle il est interdit par défaut et une meilleure façon de le faire, mais au moins ça marche.

0

Serait-il acceptable de mettre un délai dans le script removeuserIP?

#!/bin/bash 
sleep 1m 
sudo iptables -t nat -D PREROUTING -s $1 -j ACCEPT; 
sudo iptables -D FORWARD -s $1 -j ACCEPT; 
+0

Je ne pense pas. OP pourrait avoir mis la minute +1 ici à titre d'exemple et peut-être besoin d'une autre valeur spécifique (ou calculée en php à la volée). – Aserre

+0

Même si j'ai besoin d'un autre temps que 1m, je pourrais toujours l'envoyer au fichier de script en utilisant un argument si c'était dynamique. J'ai essayé beaucoup de solutions différentes donc je ne peux pas être sûr de ce que je dis en ce moment mais la dernière fois j'ai essayé cette solution pour ajouter un sommeil, la page attendait 1 minute, donc ce n'était pas bon . – Peter

+1

Oh oui, j'ai oublié le script PHP en attente de la fin du processus. Il semble que vous ayez le même problème en essayant de le faire comme vous le faites. Vous voudrez peut-être vérifier http://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete – infinigrove