我正在使用 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
?>
文件已更新并且重定向工作正常。
***** 附加测试结束 ******