Mari kita uji.
Hubungkan sebagai superuser, lalu:
SHOW VARIABLES LIKE "%version%";
+
| Variable_name | Value |
+
| version | 10.0.23-MariaDB-0+deb8u1-log |
lalu
USE mysql;
Mendirikan
Buat pengguna foodengan kata sandi baruntuk pengujian:
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
Menghubung
Untuk menyambung ke Soket Domain Unix (yaitu pipa I / O yang diberi nama oleh entri sistem file /var/run/mysqld/mysqld.sockatau semacamnya), jalankan ini pada baris perintah (gunakan --protocolopsi untuk memastikan ganda)
mysql -pbar -ufoo
mysql -pbar -ufoo
Orang mengharapkan bahwa kecocokan di atas "pengguna berasal dari localhost" tetapi tentu saja bukan "pengguna berasal dari 127.0.0.1".
Untuk menyambung ke server dari "127.0.0.1" sebagai gantinya, jalankan ini di baris perintah
mysql -pbar -ufoo
Jika Anda keluar --protocol=TCP, mysqlperintah akan tetap mencoba menggunakan soket domain Unix. Anda juga bisa mengatakan:
mysql -pbar -ufoo
Dua upaya koneksi dalam satu baris:
export MYSQL_PWD=bar; \
mysql -ufoo
mysql -ufoo
(kata sandi diatur di lingkungan sehingga diteruskan ke mysqlproses)
Verifikasi Jika Ada Keraguan
Untuk benar-benar memeriksa apakah koneksi berjalan melalui soket TCP / IP atau soket Domain Unix
- dapatkan PID dari proses klien mysql dengan memeriksa output dari
ps faux
- lari
lsof -n -p<yourpid>.
Anda akan melihat sesuatu seperti:
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
atau
mysql [PID] quux 3u unix [code] 0t0 [code] socket
Begitu:
Kasus 0: Host = '10 .10.10.10 '(tes nol)
update user set host='10.10.10.10' where user='foo'; flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: FAILURE
Kasus 1: Host = '%'
update user set host='%' where user='foo'; flush privileges;
- Terhubung menggunakan soket: OK
- Hubungkan dari 127.0.0.1: OK
Kasus 2: Host = 'localhost'
update user set host='localhost' where user='foo';flush privileges;
Perilaku bervariasi dan ini tampaknya tergantung skip-name-resolve. Jika disetel, menyebabkan baris dengan localhostdiabaikan menurut log. Berikut ini dapat dilihat di log kesalahan: "'entri pengguna' root @ localhost 'diabaikan dalam mode - lewati-nama-penyelesaian." . Ini berarti tidak ada koneksi melalui Unix Domain Socket. Tetapi secara empiris tidak demikian. localhostsekarang berarti HANYA Soket Domain Unix, dan tidak lagi cocok dengan 127.0.0.1.
skip-name-resolve tidak aktif:
- Terhubung menggunakan soket: OK
- Hubungkan dari 127.0.0.1: OK
skip-name-resolve pada:
- Terhubung menggunakan soket: OK
- Hubungkan dari 127.0.0.1: FAILURE
Kasus 3: Host = '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: OK
Kasus 4: Host = ''
update user set host='' where user='foo';flush privileges;
- Terhubung menggunakan soket: OK
- Hubungkan dari 127.0.0.1: OK
(Menurut MySQL 5.7: 6.2.4 Access Control, Tahap 1: Verifikasi Koneksi , String kosong '' juga berarti "sembarang host" tetapi diurutkan setelah '%'. )
Kasus 5: Host = '192.168.0.1' (tes ekstra)
('192.168.0.1' adalah salah satu alamat IP mesin saya, ubah dengan tepat dalam kasus Anda)
update user set host='192.168.0.1' where user='foo';flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: FAILURE
tapi
- Hubungkan menggunakan
mysql -pbar -ufoo -h192.168.0.1: OK (!)
Yang terakhir karena ini sebenarnya berasal dari koneksi TCP 192.168.0.1, seperti yang diungkapkan oleh lsof:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
Kasus Tepi A: Host = '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: FAILURE
Kasus Tepi B: Host = '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: FAILURE
Kasus Tepi C: Host = '127.0.0.2'
(127.0.0.2 adalah alamat loopback yang benar-benar valid, setara dengan 127.0.0.1 seperti yang didefinisikan dalam RFC6890 )
update user set host='127.0.0.2' where user='foo';flush privileges;
- Hubungkan menggunakan socket: FAILURE
- Hubungkan dari 127.0.0.1: FAILURE
Menariknya:
mysql -pbar -ufoo -h127.0.0.2terhubung dari 127.0.0.1dan KEGAGALAN
mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2 OK
Membersihkan
delete from user where user='foo';flush privileges;
Tambahan
Untuk melihat apa yang sebenarnya ada di mysql.usertabel, yang merupakan salah satu tabel izin, gunakan:
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;
ini memberi:
+
| password | user | host | su | gr | selock | modif | ria | views | funcs | replic | admin |
+
| *E8D46 | foo | | N | N | NN | NNNNN | NNN | NNN | NNNNN | NN | NNNNNN |
Demikian pula untuk tabel 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;