4

我想要一个受到适当保护的基于 PHP 的 Web 工具来运行mysqlcheck一般数据库表健康,但我不希望密码在进程列表中可见。我想运行这样的东西:

$output = shell_exec('mysqlcheck -Ac -uroot -pxxxxx -hhostname');

// strip lines that's OK
echo '<pre>'.preg_replace('/^.+\\sOK$\\n?/m', '', $output).'</pre>'; 

不幸的是,使用shell_exec(),我必须在命令行中包含密码,但我担心密码会显示在进程列表 ( ps -A | grep mysqlcheck) 中。

在我的测试机器上使用 mariadb 5.5,mysqlcheck 不会在进程列表中显示密码,但我的生产机器没有运行 mariadb 并运行不同的操作系统,我想安全一点,不要运行这些生产方面的测试。

是不是所有版本的mysql也在进程列表中隐藏密码?我的担忧不是问题吗?

4

2 回答 2

5

是的,至少从 MySQL 5.1 开始,客户端会在命令行上隐藏密码。

我从 2009 年发现了前 MySQL 社区经理 Lenz Grimmer 的博客,他在其中链接到 MySQL 5.1 源代码中的相关代码。 http://www.lenzg.net/archives/256-Basic-MySQL-Security-Providing-passwords-on-the-command-line.html

您也可以根本不在命令行上传递密码,而是将用户/密码凭据存储在 PHP 有权读取的文件中,然后执行客户端:

mysqlcheck --defaults-extra-file=/etc/php.d/mysql-client.cnf

文件名是一个例子;你可以指定任何你想要的路径。关键是大多数 MySQL 客户端工具都接受该--defaults-extra-file选项。有关更多信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/option-file-options.html

于 2013-07-15T21:32:30.177 回答
1

这是一个真正的问题,您的操作系统会显示它,只是可能不在默认视图中。

您可以改为 proc_open,这将允许您读取和写入该文件打开的流。

mysqlcheck -Ac -uroot -p -hhostname

将提示您输入可以使用 proc_open 管道写入的密码

于 2013-07-15T21:34:10.467 回答