如果 Bash 由 PHP 运行,MySQL 8.0 不会从 Bash 执行查询

问题描述 投票:0回答:1

环境 - 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 的特定内容?

php mysql bash
1个回答
0
投票

对于那些只需要答案的人。

在上述配置下,问题是在 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 ;

然后一切正常,没有警告消息。

© www.soinside.com 2019 - 2024. All rights reserved.