我有一个脚本来安装 MySQL 5.7 并在Travis CI(运行 Ubuntu 12)上运行测试。
该脚本包含这些行,以非交互模式安装 MySQL,无需密码:
add-apt-repository 'deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.7-dmr'
apt-get update
echo mysql-community-server mysql-community-server/root-pass password "" | debconf-set-selections
echo mysql-community-server mysql-community-server/re-root-pass password "" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold -q -y install mysql-server libmysqlclient-dev
安装运行顺利,使用mysql
命令行实用程序,我可以不使用密码连接到服务器:
mysql --user=root -e "SELECT VERSION();"
+-----------+
| VERSION() |
+-----------+
| 5.7.8-rc |
+-----------+
现在,如果我尝试使用 PHP PDO进行连接:
new PDO('mysql:host=localhost', 'root', '');
我收到以下错误:
SQLSTATE [HY000] [1045] 用户'root'@'localhost'的访问被拒绝(使用密码:否)
我试图允许root
从任何主机连接:
GRANT ALL ON *.* to root@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;
没有成功。
可能是什么问题?
在 MySQL 手册Pluggable Authentication中找到了答案:
MySQL 包使用身份验证插件创建
root
用户auth_socket
,因此只允许通过套接字进行连接,并且还检查了 Linux 帐户的用户名。该
mysql
命令默认使用套接字,并root
在我的脚本中运行,因此允许连接。根据 PHP 手册,一个 PDO MySQL 连接
localhost
也使用一个套接字;但是 PHP 以非特权用户身份运行,因此auth_socket
插件拒绝连接。我通过添加以下行来修复我的脚本:
现在它工作正常。
您需要通过运行以下命令禁用 SELinux: