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 foo
dengan kata sandi bar
untuk 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.sock
atau semacamnya), jalankan ini pada baris perintah (gunakan --protocol
opsi 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
, mysql
perintah 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 mysql
proses)
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 localhost
diabaikan 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. localhost
sekarang 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.2
terhubung dari 127.0.0.1
dan 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.user
tabel, 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;