2016-11-03 2 views
1

Ich versuche, ein Bash-Skript später in PHP zu starten, damit ich es in visudo erlaubt.Starten Sie ein Bash-Skript später in PHP

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

Das Skript removeuserIP nur sudo iptables tun ist ... und arbeitet:

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

und im PHP-Code, ich diese Zeile hinzu:

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

aber das Problem ist, Es startet gerade das Skript. Ich habe /log/var/auth.log eingecheckt und in der Tat, es startet jetzt den Befehl.

Ich versuchte es in einem Terminal direkt und es war kein Problem, es beginnt später (mit einem Argument, natürlich):

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

Ich habe auch versucht, es so in einem Terminal zu tun, aber diese auch funktioniert nicht, weil es nicht versteht gibt es ein Argument für die Datei:

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

ich verstehe wirklich nicht, warum es jetzt sogar beginnt, wenn es 1 Minute beginnen sollte später und jetzt nicht mehr.

+0

Versuchen Sie 'exec ('echo'/var/www/scripts/removeuserIP $ ipadresse" | jetzt + 1 Minuten '); '(notieren Sie die Anführungszeichen). Dies könnte helfen, obwohl ich mir nicht sicher bin. Wenn ja, poste ich es als Antwort. –

+0

Www-Daten in sudoers zu setzen ist eine der schlechtesten Ideen. –

+0

Ich habe versucht, wie Sie sagten, und es funktioniert immer noch nicht. Ich habe nur das Protokoll überprüft und es scheint, dass es keine Berechtigung hat, um zu verwenden, sah es in/var/log/apache2 Ich versuchte sogar in visudo: www-Daten ALL = (alle) NOPASSWD: ALL und es sagt immer noch nein Erlaubnis zur Verwendung bei. Warum ist es eine der schlechtesten Idee? Irgendein anderer Vorschlag, etwas Sichereres zu tun? Um ehrlich zu sein, ich bin ein Anfänger mit Apache2/PHP, also bin ich nicht überrascht von Ihrer Antwort. – Peter

Antwort

0

Lösung: Endlich, nach Überprüfung /var/log/apache2/error.log, sah ich, dass es nicht die Erlaubnis zu verwenden hat.

In der Tat müssen Sie gehen /etc/at.deny und entfernen Sie die Zeile www-Datum mit um. Es gibt wahrscheinlich einen Sicherheitsgrund dafür, warum es standardmäßig verboten ist und einen besseren Weg, dies zu tun, aber zumindest funktioniert es.

0

Wäre es akzeptabel, eine Zeitverzögerung in removeuserIP Skript zu setzen?

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

Ich glaube nicht. OP könnte die +1 Minute hier als Beispiel gesetzt haben und vielleicht einen anderen spezifischen Wert (oder php im laufenden Betrieb berechnet). – Aserre

+0

Auch wenn ich eine andere Zeit als 1m brauche, könnte ich sie immer mit einem Argument an die Skriptdatei senden, wenn es dynamisch wäre. Ich habe viele verschiedene Lösungen ausprobiert, so kann ich nicht sicher sein, was ich gerade sage, aber das letzte Mal, als ich diese Lösung versuchte, einen Schlaf hinzuzufügen, war die Seite 1 Minute warten, also war es nicht gut . – Peter

+1

Oh ja, ich habe vergessen, dass das PHP-Skript darauf wartet, dass der Prozess beendet wird. Es sieht so aus, als hätten Sie dasselbe Problem, wie Sie es tun. Sie können http://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete überprüfen – infinigrove

Verwandte Themen