我可以使用以下代码轻松授予对一个 IP 的访问权限:
$ mysql -u root -p
Enter password:
mysql> use mysql
mysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';
mysql> FLUSH PRIVILEGES;
但我需要允许整个子网 192.168.1.* 远程访问数据库。
我怎样才能做到这一点?
GRANT ... TO 'user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY ...
编辑:考虑在此页面上查看并支持Malvineous的答案。网络掩码是一个更优雅的解决方案。
只需在 IP 地址中使用百分号作为通配符。
来自http://dev.mysql.com/doc/refman/5.1/en/grant.html
您可以在主机名中指定通配符。例如,
user_name@'%.example.com'
适用于域中user_name
的任何主机,适用于C类子网中的任何主机。example.com
user_name@'192.168.1.%'
user_name
192.168.1
您只需使用 '%' 作为通配符,如下所示:
GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';
mysql> GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';
通配符是“%”而不是“*”
只是我遇到的一个特殊性的注释:
考虑:
db server: 192.168.0.101
web server: 192.168.0.102
如果您在 mysql.user 中定义了一个用户,'user'@'192.168.0.102'
使用密码 1 和另一个'user'@'192.168.0.%'
使用密码 2,
然后,
如果您尝试使用密码 2 以“用户”身份从 Web 服务器连接到数据库服务器,
它将导致“拒绝访问”错误,因为 'user'@'192.168.0.102'
在通配符身份验证上使用了单一 IP 身份'user'@'192.168.0.%'
验证。
连接服务器并想在主机上连接后,您应该执行以下步骤:
GRANT ALL ON . to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect'
nano /etc/mysql/my.cnf
service mysql restart
受@Malvineaus 回答的启发,我自己尝试了一下,发现它对我不起作用。
您可以使用“192.168.1.%”或“192.168.1.0/255.255.255.0”指定子网掩码,但子网必须始终使用完整的八位字节。请参阅https://mariadb.com/kb/en/create-user/#host-name-component。结果,一种规范方式和另一种规范方式之间的功能是相同的。
例如 '192.168.1.0/255.255.255.128' 将不起作用,因为它不在完整的八位字节边界上。
MySQL 8.0.23 及以后的版本现在也支持 CIDR 表示法。
所以,基本上:
-- CIDR Notation
GRANT ... TO 'user'@'192.168.1.0/24' IDENTIFIED BY ...
-- Netmask Notation
GRANT ... TO 'user'@'192.168.1.0/255.255.255.0' IDENTIFIED BY ...