2016-11-03 1 views
1

Я пытаюсь запустить скрипт bash позже в PHP, поэтому я разрешил его в visudo.Начать скрипт bash позже в PHP

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

Сценарий removeuserIP просто делает sudo iptables ... и работает:

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

и в коде PHP, я ставлю эту строку:

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

но вопрос он запускает скрипт прямо сейчас. Я проверил в /log/var/auth.log, и действительно, он начинает команду прямо сейчас.

Я попробовал его в терминале непосредственно и не было никакой проблемы, он начинает позже (с аргументом, конечно):

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

Я также попытался это сделать, как в терминале, но этот не работает тоже, потому что он не понимает, есть аргумент файла:

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

Я действительно не понимаю, почему он начинает прямо сейчас, даже если он должен начать 1 минуту позже и не сейчас.

+0

Попробуйте выполнить 'exec ('echo'/var/www/scripts/removeuserIP $ ipaddress" | в настоящее время + 1 минута '); '(отметьте кавычки). Это может помочь, хотя я не уверен. Если да, я отправлю его в качестве ответа. –

+0

Ввод www-данных в sudoers - одна из худших идей. –

+0

Я пробовал, как вы сказали, и он все еще не работает. Я просто проверил журнал и, похоже, у него нет разрешения на использование, видел его в/var/log/apache2 Я даже пробовал в visudo: www-data ALL = (all) NOPASSWD: ALL и он все еще говорит, что нет разрешение на использование. Почему это одна из худших идей? Любое другое предложение сделать что-то более безопасным? Честно говоря, я начинаю с apache2/php, поэтому я не удивлен вашим ответом. – Peter

ответ

0

Решение: Наконец, после проверки /var/log/apache2/error.log, я увидел, что он не имеет разрешения на использование в.

На самом деле вам нужно пойти /etc/at.deny и удалить строку www-date с помощью. Вероятно, есть причина для безопасности, почему это запрещено по умолчанию и лучший способ сделать это, но по крайней мере он работает.

0

Было бы приемлемо поставить временную задержку в сценарии removeuserIP?

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

Я так не думаю. OP мог бы поставить +1 минуту здесь в качестве примера и, возможно, нуждается в другом конкретном значении (или рассчитывается в php на лету). – Aserre

+0

Даже если мне нужно другое время, кроме 1 м, я всегда могу отправить его в файл сценария, используя аргумент, если он был динамическим. Я пробовал много разных решений, поэтому я не могу быть уверен в том, что я сейчас говорю, но в последний раз я попробовал это решение, чтобы добавить сон, страница ждала 1 минута, так что это было не очень хорошо , – Peter

+1

О да, я забыл о скрипте PHP, ожидая завершения процесса. Похоже, у вас будет такая же проблема, как вы это делаете. Вы можете проверить http://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete – infinigrove

Смежные вопросы