环境 - Almalinux 9 最新,Apache/2.4.57,MySQL 8.0.36,PHP 7.4.33 - PHP 测试文件 - phpbash.php
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
shell_exec("sh /d/phpbash.sh") ;
echo "DONE" ;
?>
Bash 测试文件
#!/bin/bash
mysql -uroot -e 'SELECT id, programid FROM data.call' >> /d/testoutput.txt ;
printf 'SELECT id, programid FROM data.call\n' >> /d/testoutput.txt ;
exit ;
sh
问题描述
当从 shell 运行时 - sh /d/phpbash.sh - 两个命令都已执行。
当从浏览器 PHPBASH.PHP 运行时 - 仅执行了 PRINTF 命令,MySQL SELECT 被忽略。
随着 PRINTF 的工作 - 这意味着所有权限都足以执行由 PHP 启动的 BASH。
为 MySQL 启用完整日志 - 这样的查询甚至没有出现在那里,因此甚至没有从 bash 传递。
ERGO - 在 MySQL 8 下,如果 BASH 由 PHP 运行,我无法将查询从 BASH 传递到 MySQL。
(顺便说一句,另一台服务器上的相同脚本在相同环境下运行,但 CentOS 7 和 MySQL 5.5 版本)
可能应该在 MySQL 8 配置中添加一个“秘密设置”以允许这样的查询?或者 Apache 的特定内容?
对于那些只需要答案的人。
在上述配置下,问题是在 Apache error_log 中发现的,而不是在 PHP 输出中发现的。很经典
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
因为在我的例子中,直接从 shell 运行时,BASH 知道 root 的密码在哪里。
但是当通过 PHP 运行相同的 BASH 时 - 应该添加其中详细描述的变体之一 在终端内使用 mysql 抑制警告消息,但密码写在 bash 脚本中 例如
mysql --defaults-extra-file=/path/to/config.cnf -e 'SELECT id, programid FROM data.call' >> /d/testoutput.txt ;
然后一切正常,没有警告消息。