MySQL त्रुटि: उपयोगकर्ता 'a' @ 'लोकलहोस्ट' के लिए प्रवेश अस्वीकृत (पासवर्ड का उपयोग कर: YES)


22

मैं खाता बनाया रूट खाता का उपयोग करें 'a'@'%'। जब मैं होस्ट पैरामीटर निर्दिष्ट करता हूं तो मैं MySQL सर्वर से कनेक्ट करने के लिए खाते का उपयोग नहीं कर सकता। मैं सफलतापूर्वक -hपैरामीटर के बिना कनेक्ट कर सकता हूं । कृपया नीचे ट्रांसक्रिप्ट देखें। मुझे उम्मीद है कि कोई मुझे समझाने में मदद कर सकता है। धन्यवाद।

mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for a@%                                                                                            |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye

[root@localhost ~]# mysql -h localhost -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1

Connection id:      20
Current database:   
Current user:       a@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.17 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock
Uptime:         15 days 15 hours 20 min 18 sec

Threads: 1  Questions: 40  Slow queries: 0  Opens: 41  Flush tables: 1  Open tables: 4  Queries per second avg: 0.000
--------------

mysql> 

संपादित करें:

हाँ, MySQL पोर्ट 3306 पर सुन रहा है।

[root@localhost ~]# nmap localhost

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
631/tcp  open  ipp
840/tcp  open  unknown
3306/tcp open  mysql

Nmap finished: 1 IP address (1 host up) scanned in 0.064 seconds
[root@localhost ~]# 

1
मैं MySql का विशेषज्ञ नहीं हूं, लेकिन मैंने इस समस्या को कुछ बार देखा, मुझे नहीं पता कि इसका कारण क्या था, समाधान में स्पष्ट रूप से मेजबान की परिभाषा थी 'a'@'%'। इसलिए, पहला रिकॉर्ड था 'a'@'%', और दूसरा है 'a'@'localhost'
कॉम

क्या आप निम्न mysql संस्करण के साथ एक ही चीज़ का परीक्षण कर सकते हैं ..?
अब्दुल मनाफ

कनेक्ट करने के लिए Cpanel लॉगिन विवरण का उपयोग करें।
अबू फहीम

मेरे मामले में मेरे पास डिफ़ॉल्ट रूप से बनाए गए तीन अनाम खाते थे, उन्हें हटाने से यह समस्या हल हो जाएगी
जोकिन एल। रॉबर्ट्स

जवाबों:


26

यहां यह देखने के लिए एक त्वरित और गंदा तरीका है कि MySQL सफल प्रमाणीकरण कैसे करता है।

कृपया इस क्वेरी को चलाएं:

SELECT USER(),CURRENT_USER();

USER () रिपोर्ट करता है कि आपने mysqld में कैसे प्रमाणित करने का प्रयास किया

CURRENT_USER () रिपोर्ट करता है कि आपको mysqld द्वारा कैसे प्रमाणित करने की अनुमति दी गई थी

कभी-कभी, USER()और CURRENT_USER()अलग होते हैं। ऐसा इसलिए है क्योंकि mysql प्रमाणीकरण एक विशिष्ट प्रोटोकॉल का अनुसरण करता है।

MySQL 5.0 प्रमाणन अध्ययन गाइड के अनुसार

यहाँ छवि विवरण दर्ज करें

पृष्ठ 486,487 mysql के प्रमाणीकरण एल्गोरिथ्म पर निम्नलिखित बताते हैं:

ग्राहक अभिगम नियंत्रण के दो चरण हैं:

पहले चरण में, एक क्लाइंट कनेक्ट करने का प्रयास करता है और सर्वर कनेक्शन को स्वीकार या अस्वीकार करता है। सफल होने के प्रयास के लिए, उपयोगकर्ता तालिका में कुछ प्रविष्टि होस्ट से मेल खाना चाहिए जिससे क्लाइंट कनेक्ट होता है, उपयोगकर्ता नाम और पासवर्ड।

दूसरे चरण में (जो केवल तब होता है जब कोई ग्राहक पहले से ही सफलतापूर्वक जुड़ा हुआ है), सर्वर क्लाइंट से प्राप्त होने वाली प्रत्येक क्वेरी की जाँच करता है कि ग्राहक के पास इसे निष्पादित करने के लिए पर्याप्त विशेषाधिकार हैं या नहीं।

सर्वर होस्ट के आधार पर अनुदान तालिकाओं में प्रविष्टियों के खिलाफ एक क्लाइंट से मेल खाता है जिससे क्लाइंट कनेक्ट होता है और उपयोगकर्ता क्लाइंट प्रदान करता है। हालाँकि, एक से अधिक रिकॉर्ड के लिए यह संभव है:

अनुदान तालिका में होस्ट मान निर्दिष्ट किए जा सकते हैं क्योंकि पैटर्न में वाइल्डकार्ड मान शामिल हैं। एक अनुदान मेज से प्रविष्टियों शामिल हैं myhost.example.com, %.example.com, %.com, और %, उन सभी को एक ग्राहक जो से जोड़ता है से मेल खाते हैं myhost.example.com

अनुदान तालिका प्रविष्टियों में उपयोगकर्ता मानों के लिए पैटर्न की अनुमति नहीं है, लेकिन उपयोगकर्ता नाम निर्दिष्ट करने के लिए खाली स्ट्रिंग के रूप में एक उपयोगकर्ता नाम दिया जा सकता है। खाली स्ट्रिंग किसी भी उपयोगकर्ता नाम से मेल खाता है और इस प्रकार प्रभावी रूप से वाइल्डकार्ड के रूप में कार्य करता है।

जब होस्ट और उपयोगकर्ता मान एक से अधिक उपयोगकर्ता तालिका रिकॉर्ड क्लाइंट से मेल खाते हैं, तो सर्वर को यह तय करना होगा कि किसका उपयोग करना है। यह सबसे विशिष्ट होस्ट और उपयोगकर्ता कॉलम मानों के साथ रिकॉर्ड को क्रमबद्ध करके करता है, और क्रमबद्ध सूची में पहले होने वाले मिलान रिकॉर्ड को चुनना, सॉर्ट करना निम्नानुसार होता है:

होस्ट स्तंभ में, इस तरह के रूप में शाब्दिक मूल्यों localhost, 127.0.0.1और myhost.example.comतरह मूल्यों जैसे के आगे %.example.com उन्हें पैटर्न वर्ण है। पैटर्न मानों के अनुसार क्रमबद्ध किया जाता है कि वे कितने विशिष्ट हैं। उदाहरण के लिए, %.example.comकी तुलना में अधिक विशिष्ट है %.com, जो की तुलना में अधिक विशिष्ट है %

उपयोगकर्ता कॉलम में, गैर-रिक्त उपयोगकर्ता नाम रिक्त उपयोगकर्ता नाम के आगे क्रमबद्ध होते हैं। यानी गैर-अनाम उपयोगकर्ता अनाम उपयोगकर्ताओं के आगे क्रमबद्ध होते हैं।

सर्वर शुरू होने पर यह छँटाई करता है। यह अनुदान तालिकाओं को मेमोरी में पढ़ता है, उन्हें सॉर्ट करता है, और एक्सेस कंट्रोल के लिए इन-मेमोरी कॉपी का उपयोग करता है।

इस विवरण से, आपको mysql.user तालिकाओं के क्रम के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि अनुदान तालिकाओं की एक मेमोरी मेमोरी कॉपी है जो पहले बताए गए अनुसार क्रमबद्ध है।

आप कैसे लॉग इन करते हैं, इस संबंध में केवल mysql -u aकाम किया है। वापस जाएं और फिर से लॉगिन करें और इन कमांड को चलाएं

SELECT USER(),CURRENT_USER();
SELECT user,host,password FROM mysql.user;

निश्चित करें कि

  • हर उपयोगकर्ता के पास एक पासवर्ड होता है।
  • कोई अनाम उपयोगकर्ता नहीं हैं (जब उपयोगकर्ता खाली है)

यह केवल एक अनुमान है, लेकिन मुझे mysql -u aलोकलहोस्ट के माध्यम से कनेक्ट होने का संदेह है क्योंकि जब कनेक्शन प्रोटोकॉल निर्दिष्ट नहीं किया जाता है, तो डिफ़ॉल्ट सॉकेट फ़ाइल के माध्यम से कनेक्ट करना है। mysql.userअनाम लोकलहोस्ट कनेक्शन की अनुमति देने वाली प्रविष्टि मौजूद हो सकती है ।

यह क्वेरी चलाएँ:

SELECT user,host,password FROM mysql.user WHERE user='' AND host='localhost';

यदि आपको बिना पासवर्ड वाली एक पंक्ति वापस मिलती है, तो यह पूरी तरह से बताता है कि mysq -u aकाम क्यों करता है।

UPDATE 2012-01-19 11:12 EDT

क्रेग एफ्रेइन ने एक दिलचस्प सवाल उठाया: यदि mysql.user तालिका में दो समान उपयोगकर्ता नाम मौजूद हैं, एक पासवर्ड के साथ और एक बिना, इसका मतलब यह नहीं है कि पासवर्ड का उपयोग नहीं करने पर MySQL प्रमाणीकरण से इनकार करता है?

यह प्रश्न MySQL उपयोगकर्ता प्रमाणीकरण के बारे में एक उत्कृष्ट शीर्ष है।

कृपया ध्यान दें कि mysql.user की प्राथमिक कुंजी होस्ट, उपयोगकर्ता है। अन्य सूचकांक नहीं हैं। यह एक उपयोगकर्ता नाम की कई घटनाओं की अनुमति देता है। प्रत्येक घटना का एक अलग पासवर्ड या कोई पासवर्ड नहीं हो सकता है। इससे उपयोगकर्ता 'dbuser' को स्थानीय रूप से लॉगिन करने की अनुमति देता है (dbuser @ localhost), बिना किसी पासवर्ड का उपयोग किए और उसी उपयोगकर्ता के किसी अन्य सर्वर से दिए गए नेटब्लॉक (dbuser@'10.1.2.20) के भीतर 'पास 1' जैसे पासवर्ड के साथ लॉगिन करता है और वह उपयोगकर्ता लॉगिन करता है कहीं से भी दूर से (dbuser @ '%') 'pass2' जैसे रिमोट पासवर्ड के साथ।

MySQL का उपयोग करने वाले प्रमाणीकरण एल्गोरिदम को देखते हुए, पासवर्ड की उपस्थिति या अनुपस्थिति के साथ उपयोगकर्ताओं पर कोई प्रतिबंध नहीं है।

यही कारण है कि MySQL 5.0 सर्टिफिकेशन स्टडी गाइड पेज 498 पर अपने बुलेटपॉइंट में पैरा 6 कहता है कि प्रमाणीकरण प्रक्रिया को कैसे साफ करना है:

यूनिक्स पर, MySQL एक mysql_secure_installation स्क्रिप्ट के साथ आता है जो आपके इंस्टॉलेशन के लिए सुरक्षा से संबंधित कई सहायक कार्य कर सकता है। स्क्रिप्ट में निम्नलिखित क्षमताएं हैं:

  • रूट खातों के लिए एक पासवर्ड सेट करें
  • किसी भी सुगम्य रूट खाते को हटा दें।
  • अनाम उपयोगकर्ता खाते निकालें। इससे सुरक्षा में सुधार होता है क्योंकि यह किसी दूरस्थ होस्ट से रूट के रूप में MySQL सर्वर से कनेक्ट होने की संभावना को रोकता है। परिणाम यह है कि जो कोई भी रूट के रूप में कनेक्ट करना चाहता है, उसे पहले सर्वर होस्ट पर लॉग इन करने में सक्षम होना चाहिए, जो हमले के खिलाफ एक अतिरिक्त बाधा प्रदान करता है।
  • परीक्षण डेटाबेस निकालें (यदि आप अनाम खाते हटाते हैं, तो आप उस परीक्षण डेटाबेस को भी निकालना चाह सकते हैं, जिसमें उनकी पहुँच हो)।

हाँ, मैंने कोशिश की, यह बिना पासवर्ड वाली एक पंक्ति लौटाता है। अपने उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद और MySQL प्रमाणन पुस्तक की सिफारिश की।
बस एक शिक्षार्थी

2
रोलांडो, अगर mysql.user तालिका में दो समान उपयोगकर्ता नाम मौजूद हैं, एक पासवर्ड के साथ और एक बिना, इसका मतलब यह नहीं है कि पासवर्ड का उपयोग न करने पर MySQL प्रमाणीकरण से इनकार करता है?
क्रेग एफ्रेइन

@ क्रेग - आपका प्रश्न बहुत ही उल्लेखनीय है। मैं इसे अपने उत्तर में स्थानांतरित करूंगा और इसे वहां संबोधित करूंगा।
रोलैंडमाइसीडीडीबीए

विस्तृत जवाब के लिए धन्यवाद, मेरे मामले में मेरे पास अनाम उपयोगकर्ता थे जो किसी भी तरह कॉन्फ़िगर किए गए थे।
SoWeLie

@RolandoMySQLDBA, प्रमाणीकरण अध्ययन गाइड में सभी जानकारी कर सकते हैं पहले से ही ऑनलाइन मैनुअल MySQL में पाया जा सकता है?
पचेरियर

5

'%' होस्ट वाइल्डकार्ड 'लोकलहोस्ट' से मेल नहीं खाता। डिफ़ॉल्ट रूप से mysql क्लाइंट tcp के बजाय सॉकेट के माध्यम से जुड़ने की कोशिश करेगा (आमतौर पर कुछ जगह जैसे /var/lib/mysql/mysql.sock)।

आप या तो अपना अनुदान 'ए' @ 'लोकलहोस्ट' में बदल सकते हैं, या क्लाइंट को टीसीपी स्टैक की तरह काम करने के लिए मजबूर कर सकते हैं:

mysql -u a -p --protocol=TCP

मैंने कोशिश की, लेकिन अभी भी कोई भाग्य नहीं है।
बस एक शिक्षार्थी

my.cnfइस पैरामीटर को किसी भी अधिक की आवश्यकता नहीं करने के लिए इस विकल्प को कैसे कॉन्फ़िगर करें ?
shgnInc

1
तुम नहीं। यदि आप -h होस्टनाम निर्दिष्ट नहीं करते हैं, तो यह "लोकलहोस्ट" मानता है जिसका अर्थ है कि यह सॉकेट की तलाश में है, न कि टीसीपी पोर्ट w / o प्रोटोकॉल ध्वज। यदि आप सभी तर्कों को लिखकर थक गए हैं, तो आप एक शेल अलाइज़ सेटअप कर सकते हैं।
atxdba

2

क्या आपने यह सुनिश्चित करने के लिए जांच की थी कि MySQL वास्तव में 3306 पर सुन रहा है? एक netstat -tlpn चलाएं और परिणाम प्रदान करें। यदि आप 3306 नहीं देखते हैं तो शायद नहीं।

में my.cnf आप सत्यापित करना चाहिए कि --skip-नेटवर्किंग बाहर टिप्पणी की है

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
language        = /usr/share/mysql/English
bind-address    = 65.55.55.2
# skip-networking

मैंने भी वही किया जो सवाल में पूछा गया था। और यह भी कहा कि आप अपने उत्तर में क्या कहते हैं लेकिन अभी भी वही मुद्दा है।
अब्दुल मनफ

क्या आप निम्नलिखित क्वेरी से परिणाम प्रदान कर सकते हैं: उपयोगकर्ता का चयन करें, mysql.user से होस्ट करें;
क्रेग इफरीन

हाँ, MySQL पोर्ट 3306 पर सुन रहा है। मेरा संपादन देखें।
एक शिक्षार्थी

आप mysql -u उपयोगकर्ता -p -h 127.0.0.1 भी आज़माना चाह सकते हैं। अगर वह काम करता है तो मुझे विश्वास है कि इसके mysql को पता नहीं है कि लोकलहोस्ट को कैसे हल किया जाए। लोकलहोस्ट के लिए एक प्रविष्टि जो आपके / etc / मेजबान फ़ाइल में 127.0.0.1 को इंगित करती है, वह हल करेगी।
क्रेग इफरीन

क्या आपने फ्लश विशेषाधिकार चलाया?
क्रेग इफरीन

1

जैसा कि @atxdba ने वर्णित किया है, mysql डेमन को रिमोट से कनेक्ट करने के लिए जो सॉकेट के माध्यम से कनेक्ट नहीं होता है, इसलिए आपको टीसीपी से रिमोट से कनेक्ट करने की आवश्यकता है।

इसके लिए, आपको --protocol=TCPप्रत्येक कनेक्शन प्रति निर्दिष्ट करना चाहिए । हालाँकि, आप इसे my.cnfसर्वर पर सेट कर सकते हैं :

[client]
protocol=tcp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.