Использование exec в php для настройки системных часов

#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