这是我的简单 PHP 文件:
<?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))));
}
}
这里是发送数据的 javascript 片段:
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));
}
发送的内容是这样的:
2023-09-08T20:49:28.696Z
清理后$datetime
看起来像:
2023-09-08 20:49:28
因此执行的命令是:
date -s "2023-09-08 20:49:28"
该命令已成功执行,因为我收到了输出:
Fri Sep 8 20:49:28 UTC 2023
但检查服务器上的实际情况date
发现该命令实际上并未执行:
# date
Thu Jan 1 08:34:07 UTC 1970
但如果我手动输入上面完全相同的命令,它就会起作用:
# 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
这里发生了什么?我正在为 Raspberry Pi 3 开发 Linux,并apache2
以 root 身份运行。
这不一定是真的。你不能根据输出来确定成功。如果您检查命令的退出状态(通过作为
$result_code
参数传递给exec()
),您可能会发现它不为零(指示错误)。这几乎肯定不是真的。它以 www-data 或其他非 priv 用户身份运行。因此,当它执行脚本时,它没有设置时钟的权限。但是,在这种情况下,该
date
命令仍然输出日期,这就是您所看到的。如果你也捕获 stderr,你会得到: