我在Ubuntu 16.04上的MariaDB上有一个root用户。
默认情况下,root用户通过unix_socket
身份验证插件进行身份验证。
我可以通过设置
将身份验证方法切换为密码方法update mysql.user set plugin='' where user='root';
这很好用。但是......
是否有可能通过unix_socket(root shell)或密码(当它通过localhost:3306连接时)验证root用户?
答案 0 :(得分:5)
一种可靠而直接的方法是创建另一个超级用户,并在想要通过密码连接时使用它。
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc
答案 1 :(得分:2)
是 - 从 MariaDB 10.4(2019 年 6 月发布*)开始,you can use the OR
keyword with IDENTIFIED VIA
允许使用多种身份验证方法中的任意一种:
CREATE OR ALTER USER `minecraft`
IDENTIFIED VIA unix_socket
OR mysql_native_password USING PASSWORD("s3cr3tpasswvrd");
https://mariadb.com/kb/en/pluggable-authentication-overview/#extended-sql-syntax
*尽管操作系统供应商可能会拖延时间,甚至完全拒绝提供更新,但 MariaDB 提供了an official repository 服务至少这个版本的发行版Ubuntu 14.04、CentOS 和 RHEL 6、Debian 7 和 Fedora 28(以及每个版本的最新版本),但对于其中一些 (e.g. Fedora < 32),您可能需要手动修改 URL 中的版本。
答案 2 :(得分:1)
MySQL认为'localhost'与'127.0.0.1'不同,因此您可以为TCP设置密码,而对于Unix套接字则不设置密码,
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION;
答案 3 :(得分:1)
是否可以通过unix_socket(通过root shell)或通过密码(通过localhost:3306连接)来验证root用户?
在MySQL中auth_socket
或在MariaDB中unix_socket
的目的是禁用密码身份验证,而支持Unix套接字,后者仅允许经过验证的本地用户连接到服务器。
换句话说,同一用户/主机不能有多个身份验证插件。但是,就像其他人指出的那样,一种常见的解决方法是创建其他用户(具有相同的用户名),这些用户与不同的host
地址(密码甚至可以相同)关联。
正如@ColinM所述,localhost
通常默认使用套接字,而127.0.0.1
本质上是非套接字的,因为它是一个IP地址,例如TCP协议。
Here's an example对于MySQL 8.0.x:
mysql -e "CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED WITH auth_socket;"
mysql -e "CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '@DB_PASSWORD_ROOT';"
mysql -e "CREATE USER 'root'@'::1' IDENTIFIED WITH mysql_native_password BY '@DB_PASSWORD_ROOT';"
要确保auth_socket
对您的my.cnf
具有持久性add lines:
plugin-load-add = auth_socket.so
auth_socket = FORCE_PLUS_PERMANENT
请记住,现在建议创建一个单独的非root用户,以与数据库管理工具(例如phpMyAdmin或Adminer)一起使用。 admin@127.0.0.1
,并且还意识到新的密码哈希插件caching_sha2_password
与许多应用程序的兼容性较弱,尤其是。如果他们没有使用TLS / SSL,Unix套接字或共享内存进行身份验证。
答案 4 :(得分:0)
从10.4开始,您可以简单地运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
由于unix_socket
在默认情况下处于启用状态。然后使用sudo保护该命令。
答案 5 :(得分:-1)
或者干脆 mysql -u user -pYouPassword -e <<< printf 'INSERT INTO 'tablename' ('id', 'day', 'time', 'rank') VALUES (NULL, "'${id}'", "' ${day}'", "'${time}'", NULL);' DB_NAME