gpt4 book ai didi

PHP system() 调用在由 shell 调用时不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:14 24 4
gpt4 key购买 nike

我有一个由 cron 运行的 shell 文件:

* * * * * /bin/sh /var/www/test.sh > /dev/null 2>&1

该文件只包含这一行:

php -q /var/www/test.php

那个 php 文件包含这个:

<?php
$command = 'cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg';
system($command);
$command = 'mkdir /var/www/test_dir';
system($command);
file_put_contents('var/www/test_user.log', posix_getpwuid(posix_geteuid())['name']);
if (file_exists('/var/www/test.pdf')) {
file_put_contents('/var/www/test.log', 'success');
} else {
file_put_contents('/var/www/test.log', 'fail');
}

cairosvg 是一个将 SVG 文件转换为 PDF 的 CLI 库。如果我执行上述步骤,此 PHP 代码会运行,但不会创建文件。如果我通过 URL 调用 PHP 文件,则会创建该文件。

我看到的唯一区别是进程用户 posix_getpwuid(posix_geteuid())['name'] 在通过 URL 和 运行时是 www-data root 由 shell 运行时。

命令 cairosvg -f pdf -o/var/www/test.pdf/var/www/test.svg 在我以 root 身份在终端中运行时有效。

第二个命令,mkdir/var/www/test_dir 只是一个现实检查,以确保 system() 为 CLI 或其他非常简单的东西启用。该命令适用于 shell 和 URL。

这是更复杂系统上问题的最小、完整和可验证的示例,因此“跳过 shell 步骤”或类似的答案对我来说不会很有帮助。

我正在运行 PHP 5.6、Ubuntu 14.04 和 Apache。

为什么当我通过 shell 调用而不是通过 URL 调用时,这段 PHP 代码会失败?

最佳答案

在评论中感谢 Nico Haase、pomaxa 和 kvantour。

system() 返回状态为 127。这表明用户 (root) 无法识别 cairosvg 命令。我将 /usr/bin/cairosvg 符号链接(symbolic link)到 /usr/local/bin/cairosvg 并且一切正常。

shell 内部的 root 无法访问本地 cairosvg 的原因是 explained hereCRON 下,在受限环境中运行您的命令

What environment variables are available is likely to be very limited. Typically, you'll only get a few variables defined, such as $LOGNAME, $HOME, and $PATH.

关于PHP system() 调用在由 shell 调用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com