![从 PHP 网页调用时包含 exigrep 命令的 bash 脚本出现问题](https://linux22.com/image/183500/%E4%BB%8E%20PHP%20%E7%BD%91%E9%A1%B5%E8%B0%83%E7%94%A8%E6%97%B6%E5%8C%85%E5%90%AB%20exigrep%20%E5%91%BD%E4%BB%A4%E7%9A%84%20bash%20%E8%84%9A%E6%9C%AC%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我有一个 bash 脚本来从 exim_mainlog 中提取信息。当从 putty 命令行(以 root 身份登录)运行 bash 脚本时,提取的数据将正确写入输出文件。但是,当从 PHP 网页调用 bash 脚本时,grep 结果将写入输出文件,但 exigrep 结果不会。 PHP 网页位于 cPanel 帐户中。
这似乎不是权限问题,因为 exim_mainlog 中的 grep 提取内容已正确写入输出文件,而 exigrep 提取内容则不然。
这是我的 PHP:
<?php
$output=shell_exec("sh /home/account/public_html/cgi-bin/Log.sh");
?>
这是 bash 脚本,尝试了 3 次提取数据。当通过命令行“sh /home/account/public_html/cgi-bin/Log.sh”调用脚本时,这三个都起作用,但在 bash 脚本时仅写入 grep 结果(并且不写入 exigrep 结果)由 PHP 脚本调用:
#!/bin/bash
# grep attempt consistently writes data to the temp.log file
echo "grep" > /home/account/public_html/cgi-bin/temp.log # just a label so the source of the results is known
grep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
# exigrep attempts do not work when invoked with the PHP above
echo "exigrep" >> /home/account/public_html/cgi-bin/temp.log # just a label so the file location where the exigrep results should be is known
exigrep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
exigrep --no-pager "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
我还尝试了“exec”而不是“shell_exec”,结果相同。
根据下面的 Fox 评论,我查看了 exigrep 的权限是否与 grep 的权限不同;它们是相同的(其他人可以执行)。
答案1
为了解决 PHP 调用 bash 脚本无法运行/提供 exigrep 结果的问题,我将位于 /usr/sbin/exigrep 中的 exigrep 文件复制到包含 PHP 文件的本地帐户目录。当我将 bash 脚本 exigrep 调用更改为 /home/account/public_html/cgi-bin/exigrep 时,日志文件提取工作正常。
所以至少我有一个解决方法。
我的结论是我原来的问题不是linux问题而是PHP问题。由于某种原因,PHP 似乎无法执行 exigrep 的系统副本。也许它是珍珠文字这一事实是一个因素。
为了进一步探索这一点,我直接从 PHP 进行了一个简单的 exigrep 调用(不涉及 bash 脚本):
<?php
$output = shell_exec('exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
这不起作用。
但是,当我的帐户位于 exigrep 的副本被调用时,它可以正常工作:
<?php
$output = shell_exec('/home/account/public_html/cgi-bin/exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
更好地理解这一点将是有益的,因为如果所有 Perl 脚本都会以这种方式出现问题,则必须将所有需要的脚本复制到本地帐户目录。当然,最好更改阻止 exigrep 脚本在其正常“主目录”中执行的任何内容。
这不是一个非常强大的解决方案,而是一种可以让我获得结果并执行调查的解决方法。