चलो बस परीक्षण करते हैं।
सुपरयुसर के रूप में कनेक्ट करें, और फिर:
SHOW VARIABLES LIKE "%version%";
+
| Variable_name | Value |
+
| version | 10.0.23-MariaDB-0+deb8u1-log |
और फिर
USE mysql;
सेट अप
परीक्षण के लिए fooपासवर्ड वाला उपयोगकर्ता बनाएं bar:
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
जुडिये
यूनिक्स डोमेन सॉकेट (यानी I / O पाइप जिसे फाइलसिस्टम प्रविष्टि /var/run/mysqld/mysqld.sockया कुछ इस तरह नाम दिया गया है ) से कनेक्ट करने के लिए , इसे कमांड लाइन पर चलाएं ( --protocolविकल्प का उपयोग निश्चित रूप से सुनिश्चित करने के लिए करें)
mysql -pbar -ufoo
mysql -pbar -ufoo
एक को उम्मीद है कि उपरोक्त मैच "उपयोगकर्ता लोकलहोस्ट से आता है" लेकिन निश्चित रूप से "उपयोगकर्ता 127.0.0.1 से नहीं आता है"।
इसके बजाय "127.0.0.1" से सर्वर से कनेक्ट करने के लिए, इसे कमांड लाइन पर चलाएं
mysql -pbar -ufoo
यदि आप बाहर निकलते हैं --protocol=TCP, तोmysql कमांड यूनिक्स डोमेन सॉकेट का उपयोग करने का प्रयास करेगा। तुम भी कह सकते हो:
mysql -pbar -ufoo
एक लाइन में दो कनेक्शन के प्रयास:
export MYSQL_PWD=bar; \
mysql -ufoo
mysql -ufoo
(पासवर्ड वातावरण में सेट किया गया है ताकि इसे mysqlप्रक्रिया में पारित किया जाए )
संदेह के मामले में सत्यापन
वास्तव में जांचें कि क्या कनेक्शन टीसीपी / आईपी सॉकेट या यूनिक्स डोमेन सॉकेट से गुजरता है
- के उत्पादन की जांच करके mysql क्लाइंट प्रक्रिया का PID प्राप्त करें
ps faux
- भागना
lsof -n -p<yourpid>।
आप कुछ इस तरह देखेंगे:
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
या
mysql [PID] quux 3u unix [code] 0t0 [code] socket
इसलिए:
केस 0: होस्ट = '10 .10.10.10 '(अशक्त परीक्षण)
update user set host='10.10.10.10' where user='foo'; flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: विफलता
केस 1: होस्ट = '%'
update user set host='%' where user='foo'; flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: ठीक है
- 127.0.0.1 से कनेक्ट करें: ठीक है
केस 2: होस्ट = 'लोकलहोस्ट'
update user set host='localhost' where user='foo';flush privileges;
व्यवहार भिन्न होता है और यह स्पष्ट रूप से निर्भर करता है skip-name-resolve। यदि सेट किया जाता है, localhostतो लॉग के अनुसार लाइनों को अनदेखा किया जाता है। निम्नलिखित त्रुटि लॉग में देखा जा सकता है: "- उपयोगकर्ता 'प्रविष्टि' रूट @ localhost 'को --skip-name- रिज़ॉल्यूशन मोड में अनदेखा किया गया है।" । इसका मतलब है यूनिक्स डोमेन सॉकेट के माध्यम से कनेक्ट नहीं करना। लेकिन यह आनुभविक रूप से मामला नहीं है। localhostअब इसका मतलब केवल यूनिक्स डोमेन सॉकेट है, और यह 127.0.0.1 से मेल नहीं खाता है।
skip-name-resolve बंद है:
- सॉकेट का उपयोग करके कनेक्ट करें: ठीक है
- 127.0.0.1 से कनेक्ट करें: ठीक है
skip-name-resolve चालू है:
- सॉकेट का उपयोग करके कनेक्ट करें: ठीक है
- 127.0.0.1 से कनेक्ट करें: विफलता
केस 3: मेजबान = '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: ठीक है
केस 4: मेजबान = ''
update user set host='' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: ठीक है
- 127.0.0.1 से कनेक्ट करें: ठीक है
( MySQL 5.7: 6.2.4 एक्सेस कंट्रोल, स्टेज 1: कनेक्शन सत्यापन के अनुसार , खाली स्ट्रिंग '' का अर्थ "किसी भी मेजबान" से है लेकिन '%' के बाद क्रमबद्ध होता है। )
केस 5: मेजबान = '192.168.0.1' (अतिरिक्त परीक्षण)
('192.168.0.1' मेरी मशीन के IP पतों में से एक है, आपके मामले में उचित रूप से बदला गया है)
update user set host='192.168.0.1' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: विफलता
परंतु
- कनेक्ट का उपयोग कर
mysql -pbar -ufoo -h192.168.0.1: ठीक है ()
उत्तरार्द्ध क्योंकि यह वास्तव में टीसीपी कनेक्शन से आ रहा है 192.168.0.1, जैसा कि पता चला lsof:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
एज केस ए: होस्ट = '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: विफलता
एज केस B: होस्ट = '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: विफलता
एज केस सी: होस्ट = '127.0.0.2'
(127.0.0.2 RFC6890 में परिभाषित 127.0.0.1 के बराबर पूरी तरह से वैध लूपबैक पता है )
update user set host='127.0.0.2' where user='foo';flush privileges;
- सॉकेट का उपयोग करके कनेक्ट करें: विफलता
- 127.0.0.1 से कनेक्ट करें: विफलता
दिलचस्प बात यह है:
mysql -pbar -ufoo -h127.0.0.2से जोड़ता है 127.0.0.1और विफल है
mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2 ठीक है
साफ - सफाई
delete from user where user='foo';flush privileges;
परिशिष्ट
यह देखने के लिए कि mysql.userतालिका में वास्तव में क्या है , जो अनुमति तालिकाओं में से एक है, उपयोग करें:
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;
यह देता है:
+
| password | user | host | su | gr | selock | modif | ria | views | funcs | replic | admin |
+
| *E8D46 | foo | | N | N | NN | NNNNN | NNN | NNN | NNNNN | NN | NNNNNN |
इसी तरह तालिका के लिए 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;