#php #exec #sudo
#php #exec #sudo
Вопрос:
Я использую php-скрипт, который принимает значение метки времени из браузера и пытается установить системные часы. я использую mamp box в своем mac mini. как мне установить системные часы mac mini с помощью php-скрипта.
Я пытался использовать shell_exec, exec, system для достижения этой цели, но это не работает.
Пример, мой php-скрипт выглядит примерно так,
<?
$timestamp = $_GET['timestamp'];
exec('date '.$timestamp);
?>
Когда я пытаюсь выполнить ту же команду установки даты в терминале, я вижу, что часы меняются. (временная метка даты sudo), но я не знаю, как этого добиться с помощью php-скрипта, выполняющего привилегированную команду. Пожалуйста, помогите.
Спасибо, Срини.
Комментарии:
1. Также я использовал набор даты / времени php для установки времени, хотя я не получаю сообщение об ошибке, в системных часах нет разницы. пожалуйста, помогите
Ответ №1:
Изменение системного времени обычно ограничено учетными записями корневого уровня. PHP будет работать под идентификатором пользователя веб-сервера, который НЕ ДОЛЖЕН БЫТЬ root. Для этого вам нужно будет использовать, sudo
чтобы позволить веб-серверу работать с повышенными привилегиями.
Однако, зачем вам нужно устанавливать временные метки таким образом? По сути, вы передаете некоторые случайные данные, переданные по URL-адресу, команде оболочки. Что может помешать кому-то отправить
http://example.com?timestamp=; rm -rf /
и удаление каждого файла на вашем сервере, к которому веб-сервер имеет доступ?
Если вы пытаетесь синхронизировать время между серверами, используйте ntp, который предназначен для синхронизации часов.
Комментарии:
1. Я просто тестирую фреймворк. Это всего лишь пример. Но я вообще хотел знать, в чем идея выполнения привилегированных команд из http.
Ответ №2:
Прежде всего, очистите свой ввод. В этом случае очистите $_GET[‘timestamp’] . Убедитесь, что это в формате date
, который вы поймете. Убедитесь, что он использует escapeshellarg.
Вы можете использовать exec('sudo date '.escapeshellarg($timestamp));
. Но убедитесь, что ваш пользователь Apache имеет право на sudo без паролей. Вы можете указать в /etc/sudoers
, чтобы разрешить выполнение root ТОЛЬКО команды date . Это безопаснее.
Другой вариант — создать свой собственный сценарий оболочки и разрешить sudo только вашему сценарию.
Комментарии:
1. Как мне разрешить выполнение команды date без пароля. можете ли вы объяснить мне больше об этом
2. можете ли вы подробно объяснить, как достичь решения с помощью /etc/sudoers . Спасибо
3. Предполагая, что ваш apache работает с пользовательскими www-данными, вы можете использовать
www-data LOCAL = NOPASSWD: /usr/bin/date
подробнее на help.ubuntu.com/community/Sudoers OBS: я не тестировал строку в своих sudoers