Я пытаюсь запустить скрипт bash позже в PHP, поэтому я разрешил это в visudo.
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 минуту, а не сейчас.
Было бы приемлемо поставить задержку в removeuserIP
скрипт?
#!/bin/bash
sleep 1m
sudo iptables -t nat -D PREROUTING -s $1 -j ACCEPT;
sudo iptables -D FORWARD -s $1 -j ACCEPT;
Решение: Наконец, после проверки /var/log/apache2/error.log я увидел, что у него нет разрешения на использование в.
Фактически вы должны перейти в /etc/at.deny и удалить строку www-date с at. Вероятно, есть причина безопасности, почему это запрещено по умолчанию, и лучший способ сделать это, но по крайней мере это работает.