php curl 不返回 bash 结果

php curl 不返回 bash 结果

我在远程服务器上有一个名为 test.sh 的文件,当从命令行使用“./test.sh”调用时,它会返回两行。

到目前为止,一切都很好。

我的共享服务器上还有一个名为 result.php 的带有 curl 命令的 php 文件:

$target_url = $url_ip."/get-num-images-by-date.sh";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,  TRUE);
$response = curl_exec($ch);

curl_close($ch);

远程服务器上的文件具有所有正确的权限(755)和所有权(www-data)。

但是 var_dump($response); 并没有返回这两行代码,而是返回了 test.sh 文件的内容:

string(182) "#!/bin/bash #sudo find /mnt/usbstick/images -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c sudo find /mnt/usbstick/images -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c exit; "

我究竟做错了什么?

答案1

为什么你会看到剧本本身

问题如下:curl执行 Web 请求,让远程服务器在给定的 URL(例如http:///example.com/get-num-images-by-date.sh)上为您提供文件。运行的 Web 服务器example.com现在必须决定当此类文件请求到达时该做什么。默认情况下,Web 服务器将仅呈现文件内容。

例如,具有正确配置的 Web 服务器将知道如何处理.php文件。它们将通过 PHP 解释器运行文件中的 PHP 代码,并且仅呈现 PHP 代码输出的内容。这是大多数用户在安装“LAMP 堆栈”(Linux、Apache、MySQL 和 PHP)时想要的,我假设远程服务器上的 Web 服务器将默认呈现 PHP 文件。

对于您的 shell 脚本,Web 服务器显然没有在 Bash 中执行该文件,而只是打印了其内容 — 这就是您看到的结果curl。这实际上是一件好事!如果 Web 服务器默认执行所有可执行脚本,那么在安全性方面就会非常令人担忧。

你可以做什么

您有两种选择:

  1. 为你的服务器启用 CGI 处理(例如对于 Apache) 并让其运行 shell 脚本。
  2. 创建一个 PHP 脚本,http:///example.com/get-num-images-by-date.php通过函数调用 Bash 脚本shell_exec()并打印其输出。

如今,第二种选择更为常见。

安全注意事项

查看您的 shell 脚本:它包含一个sudo调用。如果您希望能够通过简单的 URL 调用运行该脚本,则 Web 服务器用户必须拥有您机器的 root 权限,这意味着攻击者理论上可以访问完整的 Linux 安装。

因此,建议仅授予 Web 服务器用户(apachehttpd)访问其应访问的有限目录/文件的权限。然后,您应该考虑重写 shell 脚本,使其不需要sudo。一种方法是安装具有 Web 服务器用户只读权限的外部驱动器。

相关内容