Hãy chỉ kiểm tra.
Kết nối với tư cách siêu người dùng, sau đó:
SHOW VARIABLES LIKE "%version%";
+
| Variable_name | Value |
+
| version | 10.0.23-MariaDB-0+deb8u1-log |
và sau đó
USE mysql;
Thiết lập
Tạo người dùng foo
có mật khẩu bar
để thử nghiệm:
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
Kết nối
Để kết nối với Unix Domain Socket (tức là ống I / O được đặt tên bởi mục nhập hệ thống tệp /var/run/mysqld/mysqld.sock
hoặc một số tương tự), hãy chạy điều này trên dòng lệnh (sử dụng --protocol
tùy chọn để đảm bảo gấp đôi)
mysql -pbar -ufoo
mysql -pbar -ufoo
Người ta hy vọng rằng các kết quả ở trên khớp với "người dùng đến từ localhost" nhưng chắc chắn không phải "người dùng đến từ 127.0.0.1".
Thay vào đó, để kết nối với máy chủ từ "127.0.0.1", hãy chạy điều này trên dòng lệnh
mysql -pbar -ufoo
Nếu bạn bỏ qua --protocol=TCP
, mysql
lệnh sẽ vẫn cố sử dụng ổ cắm miền Unix. Bạn cũng có thể nói:
mysql -pbar -ufoo
Hai lần thử kết nối trong một dòng:
export MYSQL_PWD=bar; \
mysql -ufoo
mysql -ufoo
(mật khẩu được đặt trong môi trường để nó được chuyển đến mysql
quy trình)
Xác minh trong trường hợp nghi ngờ
Để thực sự kiểm tra xem kết nối đi qua ổ cắm TCP / IP hay ổ cắm Miền Unix
- lấy PID của quy trình máy khách mysql bằng cách kiểm tra đầu ra của
ps faux
- chạy
lsof -n -p<yourpid>
.
Bạn sẽ thấy một cái gì đó như:
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
hoặc là
mysql [PID] quux 3u unix [code] 0t0 [code] socket
Vì thế:
Trường hợp 0: Máy chủ = '10 .10.10.10 '(kiểm tra rỗng)
update user set host='10.10.10.10' where user='foo'; flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: FAILURE
Trường hợp 1: Máy chủ = '%'
update user set host='%' where user='foo'; flush privileges;
- Kết nối bằng ổ cắm: OK
- Kết nối từ 127.0.0.1: OK
Trường hợp 2: Host = 'localhost'
update user set host='localhost' where user='foo';flush privileges;
Hành vi khác nhau và điều này dường như phụ thuộc vào skip-name-resolve
. Nếu được đặt, các dòng có localhost
bị bỏ qua theo nhật ký. Bạn có thể thấy điều sau trong nhật ký lỗi: "'mục nhập' người dùng '' root @ localhost 'bị bỏ qua trong chế độ --skip-tên-giải quyết." . Điều này có nghĩa là không có kết nối thông qua Unix Domain Socket. Nhưng theo kinh nghiệm thì không phải như vậy.localhost
bây giờ chỉ có nghĩa là Ổ cắm tên miền Unix và không còn khớp với 127.0.0.1 nữa.
skip-name-resolve
No tăt rôi:
- Kết nối bằng ổ cắm: OK
- Kết nối từ 127.0.0.1: OK
skip-name-resolve
là trên:
- Kết nối bằng ổ cắm: OK
- Kết nối từ 127.0.0.1: FAILURE
Trường hợp 3: Máy chủ = '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: OK
Trường hợp 4: Máy chủ = ''
update user set host='' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: OK
- Kết nối từ 127.0.0.1: OK
(Theo MySQL 5.7: 6.2.4 Access Control, Giai đoạn 1: Xác minh kết nối , Chuỗi trống '' cũng có nghĩa là "bất kỳ máy chủ lưu trữ nào" nhưng sắp xếp sau '%'. )
Trường hợp 5: Máy chủ = '192.168.0.1' (kiểm tra thêm)
('192.168.0.1' là một trong những địa chỉ IP trên máy của tôi, hãy thay đổi phù hợp trong trường hợp của bạn)
update user set host='192.168.0.1' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: FAILURE
nhưng
- Kết nối bằng
mysql -pbar -ufoo -h192.168.0.1
: OK (!)
Cái sau vì đây thực sự là kết nối TCP đến từ 192.168.0.1
, như được tiết lộ bởi lsof
:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
Trường hợp cạnh A: Máy chủ = '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: FAILURE
Trường hợp cạnh B: Host = '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: FAILURE
Trường hợp cạnh C: Host = '127.0.0.2'
(127.0.0.2 là địa chỉ lặp lại hoàn toàn hợp lệ tương đương với 127.0.0.1 như được định nghĩa trong RFC6890 )
update user set host='127.0.0.2' where user='foo';flush privileges;
- Kết nối bằng ổ cắm: FAILURE
- Kết nối từ 127.0.0.1: FAILURE
Một cách thú vị:
mysql -pbar -ufoo -h127.0.0.2
kết nối từ 127.0.0.1
và đang THẤT BẠI
mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2
ổn
Dọn dẹp
delete from user where user='foo';flush privileges;
Phụ lục
Để xem những gì thực sự có trong mysql.user
bảng, là một trong những bảng quyền, hãy sử dụng:
SELECT SUBSTR(password,1,6) as password, user, host,
Super_priv AS su,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs,
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic,
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin
FROM user ORDER BY user, host;
điều này mang lại:
+
| password | user | host | su | gr | selock | modif | ria | views | funcs | replic | admin |
+
| *E8D46 | foo | | N | N | NN | NNNNN | NNN | NNN | NNNNN | NN | NNNNNN |
Tương tự cho bảng mysql.db
:
SELECT host,db,user,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs
FROM db ORDER BY user, db, host;