Aqui meu arquivo PHP simples:
<?php
if (strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {
if (isset($_POST['datetime'])) {
$datetime = htmlspecialchars($_POST['datetime']);
$datetime[10] = ' ';
$datetime = substr($datetime, 0, 19);
die (json_encode(exec('date -s' . escapeshellarg($datetime))));
}
}
aqui o snippet javascript que envia dados:
function syncTime() {
let data = new FormData();
data.set("datetime", new Date().toISOString());
fetch("datetime.php", {
method: 'POST',
body: data
})
.then(response => response.json())
.then(json => console.log(json));
.catch(err => console.log('Request Failed', err));
}
O conteúdo enviado é assim:
2023-09-08T20:49:28.696Z
depois de limpar $datetime
fica assim:
2023-09-08 20:49:28
portanto, o comando executado é:
date -s "2023-09-08 20:49:28"
o comando foi executado com sucesso porque recebo de volta a saída:
Fri Sep 8 20:49:28 UTC 2023
mas verificar o date
servidor real revela que o comando não foi realmente executado:
# date
Thu Jan 1 08:34:07 UTC 1970
Mas se eu digitar manualmente o mesmo comando acima, ele funcionará:
# date -s "2023-09-08 20:49:28"
Fri Sep 8 20:49:28 UTC 2023
# date
Fri Sep 8 20:49:28 UTC 2023
O que esta acontecendo aqui? Estou trabalhando no Linux para Raspberry Pi 3 e apache2
rodando como root.
Isto não é necessariamente verdade. Você não pode determinar o sucesso com base no resultado. Se você verificar o status de saída do comando (passando
$result_code
como parâmetro paraexec()
), provavelmente descobrirá que ele é diferente de zero (indicando um erro).É quase certo que isso não é verdade. Está sendo executado como www-data ou algum outro usuário não privado. Então, quando ele executa o script, ele não tem permissão para acertar o relógio. No entanto, o
date
comando ainda exibe a data neste caso, que é o que você está vendo. Se você capturasse o stderr também, obteria: