【问题标题】:running bash script from php从 php 运行 bash 脚本
【发布时间】:2016-08-20 21:05:02
【问题描述】:

当我从 cmd 在 linux 机器上运行它(bash 脚本)时,我得到 online 作为输出,但是当我从其他机器的浏览器远程运行它时,我得到 offline 作为输出。 我的 bash 脚本:

#!/bin/bash
wget -q --tries=10 --timeout=10 --spider http://google.com
if [[ $? -eq 0 ]]; then
    echo "online"
else
    echo "offline"
fi

我的 PHP 脚本是:

<!DOCTYPE html>
<html><head><title>
This is the title
</title></head>
<body>
<?php
$output=shell_exec('/home/pi/checkonline.sh');
echo $output;
?>
</body></html>

注意:我在运行 raspbian OS、php5、apache2 的 raspberry pi 2 上托管 Web 服务器。 我使用 proxyserver 连接互联网,我已经在 apt.conf 中成功配置并导出 http_proxy,所以不会出现问题。

【问题讨论】:

  • 通过命令行执行php脚本是否有效?
  • 是的,从命令行运行 php 会在线输出。 @jedifans
  • 删除 wget 的“-q”参数并用“-v”替换它。查看 wget 打印的内容。很可能是 SElinux、Apparmor 或类似的看门狗阻止您从 Apache2 服务器进程运行 wget。
  • 在浏览器中打印 offline 仍然是一样的,但在终端中 php5 .../bash.php 给出了长输出作为连接好的最后在线
  • 尝试在 wget 执行之前设置代理设置http_proxy=$your_value wget ... 或在脚本中 wget 之前将其导出。

标签: php linux bash


【解决方案1】:

尽量使用wget的全路径

WGET=/usr/bin/wget

WGET='which wget'

【讨论】:

  • 尝试使用完整路径仍然无法在浏览器中运行,而从命令行运行 php 会提供在线输出
【解决方案2】:

尝试将您的脚本与您的 php 脚本放在同一文件夹中并添加执行权限。至于我,它可以在线工作和打印。 sudo chmod +x checkonline.sh

<!DOCTYPE html>
<html><head><title>
This is the title
</title></head>
<body>
<h1>output</h1>
<?php
$output=shell_exec('./checkonline.sh');
echo $output;
?>
</body></html>

#!/bin/bash
wget -q --tries=10 --timeout=10 --spider http://www.google.com
if [[ $? -eq 0 ]]; then
    echo "online"
else
    echo "offline"
fi

【讨论】:

  • 复制了您的代码并在浏览器中进行了与上述相同的操作,但在浏览器中它离线提供,而在终端中它在线提供,代理可能是个问题,因为我在代理服务器后面使用互联网,也许apache2 也需要配置它的代理