PHP exec date -s 运行正常,但不更新日期时间

问题描述 投票:0回答:1

这是我的简单 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

但是如果我手动输入上面的veryame命令它就可以工作:

# 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 身份运行。

javascript php datetime exec
1个回答
0
投票

命令成功执行,因为我收到了输出:

Fri Sep  8 20:49:28 UTC 2023

这不一定是真的。你不能根据输出来确定成功。如果您检查命令的退出状态(通过将

$result_code
作为参数传递给
exec()
),您可能会发现它不为零(指示错误)。

apache2 以 root 身份运行

这几乎肯定不是真的。它以 www-data 或其他非 priv 用户身份运行。因此,当它执行脚本时,它没有设置时钟的权限。但是,在这种情况下,

date
命令still输出日期,这就是您所看到的。如果你也想捕获 stderr,你会得到:

date: cannot set date: Operation not permitted
Fri Sep  8 08:49:28 PM EDT 2023
© www.soinside.com 2019 - 2024. All rights reserved.