即使通过 ls-al 在 php 中找到脚本文件,php 仍会从 exec/shell_exec python 脚本持续返回错误代码 127

即使通过 ls-al 在 php 中找到脚本文件,php 仍会从 exec/shell_exec python 脚本持续返回错误代码 127

我正在使用 CentOS x86-64 Linux 服务器,尝试从 html 脚本调用的 php 脚本运行 python 脚本。这是互联网上一个涵盖广泛的主题,但是没有任何说明和想法可行。我稍后需要此命令链来调用服务器上编译的 exe 并执行一些必要的数据预处理/后处理。为了不让任何人对实际计算任务的过多细节感到厌烦,我在这里只介绍最简单的示例:从 html 页面上传本地文本文件并调用 php 来调用回显“hello world”的 python 脚本。所有脚本都驻留在服务器上:我的 www 目录中的 html 脚本和下面显示的子目录中的 php 和 python 脚本。我在平台上没有 sudo 权限,因此我需要使用 exec()、shell_exec() 或不使用 sudo 的 system() 进行管理,无论哪种方式最终都有效。

我的问题:

(1)所选的文本文件(mcase.fm.prm)被正确识别但未移动到指定的子目录fileGMPuploads。

php 命令 echo $_FILES['userfile']['tmp_name'];

在屏幕上正确打印文件内容,因此文件已正确从本地计算机传输到服务器。php 脚本设法使用 ls -al 列出子目录 fileGMPuploads 的内容,但文本文件 mcase.fm.prm 却无处可寻。我的 html 和 php 脚本有什么问题?

(2) 为什么 php 无法执行 python 文件,并发出错误代码 127(文件未找到)的信号,即使它知道当前目录并设法将 hello.py 列在其他文件中?测试表明平台上启用了 exec()。从 php 文件中调用 test_function('exec') 返回

fn_enabled = 1 -> exec() 存在/已启用/安全模式未开启

该函数添加到下面的 php 文件的开头。

我从 php-output 中注意到,当前目录写为 /data/wwwusers/gmp/clientV。我不知道 php 从哪里发明了目录 /data/?

从 Linux 服务器上的命令行,pwd 返回 /wwwusers/gmp/clientV,这是应该的,但找不到 /data/wwwusers/gmp/clientV。但这不会分散 php 解释器列出 wwwusers/gmp/clientV 的正确内容的注意力。这会干扰 php exec()/shell_exec() 命令吗?该如何处理这个问题?

从命令行运行时,./hello.py 将按应有的方式返回“hello world”。

我还尝试了 exec() 和 shell_exec(),并使用硬连接的路径,但没有成功。错误代码 127 仍然存在。

我在下面列出了简短的脚本和输出:(1) html 脚本,(2) php 脚本,(3) python 脚本和 (4) 输出。目录 wwwusers/gmp 和 wwwusers/gmp/clientV 对 group/others 具有 xr 权限,就像 clientV/ 下的其他组件一样。

我将非常感激任何关于如何进行的建议。

1. HTML脚本:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;
      charset=windows-1252">
    <title> calling checkFileUpload.php </title>
  </head>
  <body style="text-align:center;">
    <form enctype="multipart/form-data"
      action="clientV/checkFileUpload.php"
      method="POST">
        name="MAX_FILE_SIZE" value="30000" type="hidden">
      Send this file: <input name="userfile" type="file"> <input value="Send File" type="submit">
    </form>
  </body>
</html>

2.php文件checkFileUpload.php:

<?php

function test_function($test_fn) {
// Exec 函数存在。
// Exec 未被禁用。
// 安全模式未开启。
$fn_enabled =
function_exists($test_fn) &&
!in_array($test_fn, array_map('trim', explode(', ',
ini_get('disable_functions')))) &&
strtolower(ini_get('safe_mode')) != 1;

if($fn_enabled) { echo "fn_enabled = " . $fn_enabled . " -> " . $test_fn . "() 存在/已启用/安全模式未开启\n"; }
else { echo "fn_enabled = " . $fn_enabled . " -> " . $test_fn . "() 未启用\n"; }
} /* test_function() 结束 */

echo '<pre>';

$uploaddir = 'firmGMPuploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
  echo "File is valid, and was successfully uploaded.\n";
} 
else {
  echo "upload unsuccessful\n";
}

print_r($_FILES);

echo "local path and file identification variables:\n";
echo $uploaddir;
echo "\n";
echo $uploadfile;
echo "\n";

echo "current directory: " . getcwd() . "<br>";

exec('pwd', $outputArray);
exec('ls -al', $outputArray);
print_r($outputArray);

echo "the contents of the sub-directory clientV/firmGMPuploads/:\n";
unset($outputArray);
exec("ls -al '".$uploaddir."'",$outputArray);
print_r($outputArray);

unset($outputArray);                              /* try shell_exec() */
$outputArray = shell_exec('./hello.py');
echo $outputArray;
echo "\n";

$command = './hello.py';                          /* try exec() */
unset($outputArray);
$result_code=null;
exec($command, $outputArray, $result_code);

echo $command;
echo "\n";
print_r($outputArray);
echo " result_code: ";
echo $result_code;
echo "\n";
print "</pre>";

?>

3.python文件hello.py:

#!/usr/bin/env python3

print('hello world')

4.在网络浏览器中选择本地文本文件(mcase.fm.prm)并按下“发送文件”按钮后,php 文件生成的输出:

上传失败

Array
(
    [userfile] => Array
        (
            [name] => mcase.fm.prm
            [type] => application/octet-stream
            [tmp_name] => /tmp/phpWRRYNf
            [error] => 0
            [size] => 9646
        )  
)  

本地路径和文件标识变量:
firmGMPuploads/
firmGMPuploads/mcase.fm.prm
当前目录:/data/wwwusers/gmp/clientV

Array
(
    [0] => /data/wwwusers/gmp/clientV
    [1] => total 17
    [2] => drwxr-xr-x 4 gmp    7 Feb 11 20:05 .
    [3] => drwxr-xr-x 9 gmp   30 Feb 11 19:35 ..
    [5] => -rwxr-xr-x 1 gmp 1418 Feb 11 20:05 checkFileUpload.php
    [7] => drwxr-xr-x 2 gmp    3 Feb 11 11:09 firmGMPuploads
    [8] => -rwxr-xr-x 1 gmp   45 Feb 11 09:13 hello.py
)

子目录 clientV/firmGMPuploads/ 的内容:

Array
(
    [0] => total 6
    [1] => drwxr-xr-x 2 gmp  3 Feb 11 11:09 .
    [2] => drwxr-xr-x 4 gmp  7 Feb 11 20:05 ..
    [3] => -rwx------ 1 gmp 96 Feb 11 11:09 del.csh
)

./hello.py

Array
(
)

结果代码:127

***** 额外的小测试 *****

使用文本文件测试 php 成功,没有问题,并且从 html 获得 sudo 权限 - 我甚至不需要指向当前目录。php 脚本和文本文件 cwtb.txt 位于目录 /wwwusers/gmp/ 中:

<?php
$hh = file_get_contents('cwtb.txt');
$hh=$hh+1;
file_put_contents('cwtb.txt', $hh);

header('Location:pdf_cwtb/cwtb.pdf'); // redirect to the real file to be downloaded
?>

文件已更新并且重定向工作正常。

***** 附加测试结束 ******

相关内容