মাইএসকিউএল ব্যবহারকারী তৈরি করার সময় হোস্টের জন্য% ব্যবহার করা


95

আমার মাইএসকিউএল ডাটাবেসের জন্য দুটি ব্যবহারকারী প্রয়োজন: অ্যাপ্লায়ার এবং সমর্থন and
অ্যাপ্লিকেশন বিকাশকারীদের একজন জোর দিয়ে বলেছেন যে আমি এই ব্যবহারকারীদের জন্য চারটি অ্যাকাউন্ট তৈরি করেছি:

appuser@'%'
appuser@'localhost'
support@'%'
support@'localhost'

আমার জীবনের জন্য আমি বুঝতে পারি না যে তিনি কেন মনে করেন আমাদের এটি প্রয়োজন। হোস্ট হিসাবে "ওয়াইল্ডকার্ড" ব্যবহার করে 'লোকালহোস্ট'-এর যত্ন নেবে না?

কোন ধারনা?

(এখানে মাইএসকিউএল 5.5 ব্যবহার করে)

উত্তর:


110

localhostমাইএসকিউএলে বিশেষ, এর অর্থ টিএনসিপি / আইপি সকেটের বিপরীতে ইউএনআইএক্স সকেটের (বা উইন্ডোজে নামযুক্ত পাইপগুলির বিশ্বাস) একটি সংযোগের অর্থ। %হোস্ট হিসাবে ব্যবহার অন্তর্ভুক্ত নয় localhost, সুতরাং এটি স্পষ্টভাবে নির্দিষ্ট করা প্রয়োজন।


কোন সংস্করণে? মাইএসকিউএল 5.5.35 এ, "%" লোকালহোস্টের সাথেও মেলে।
২১ শে

4
স্থানীয় সকেটের মাধ্যমে কেবল "লোকালহোস্ট" সংযুক্ত হয় না, 127.0.0.1 (যা সকেট ব্যবহার করে না)% এর সাথে মেলে না তবে এর পরিবর্তে লোকালহোস্টও মিলবে না। আজ একটি haproxy ইনস্টলেশন সঙ্গে দেখেছি।
ফিলিপ

33

@Nos যেমন এই প্রশ্নের বর্তমানে গৃহীত উত্তরগুলির মন্তব্যে উল্লেখ করেছেন, গৃহীত উত্তরটি ভুল।

হ্যাঁ, স্ট্যান্ডার্ড টিসিপি / আইপি কানেক্টের পরিবর্তে সকেট কানেক্টের মাধ্যমে সংযোগ করার সময় ব্যবহারকারীর অ্যাকাউন্টের হোস্টের ব্যবহারের ক্ষেত্রে %এবং তার মধ্যে পার্থক্য রয়েছে localhost

একটি হোস্ট মান সকেটের জন্য %অন্তর্ভুক্ত করে না localhostএবং সুতরাং আপনি যদি এই পদ্ধতিটি ব্যবহার করে সংযোগ করতে চান তবে অবশ্যই নির্দিষ্ট করতে হবে।


17

আসুন শুধু পরীক্ষা করা যাক।

সুপারউজার হিসাবে সংযুক্ত করুন এবং তারপরে:

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;

সংযোগ করুন

ইউনিক্স ডোমেন সকেটের সাথে সংযোগ স্থাপনের জন্য (যেমন ফাইল সিস্টেম এন্ট্রি /var/run/mysqld/mysqld.sockবা অন্য কিছু দ্বারা নামকরণ করা I / O পাইপ ) কমান্ড লাইনে এটি চালান ( --protocolদ্বিগুণ নিশ্চিত করার জন্য বিকল্পটি ব্যবহার করুন )

mysql -pbar -ufoo
mysql -pbar -ufoo --protocol=SOCKET

একজন আশা করে যে উপরের মিলগুলি "ব্যবহারকারী লোকহোস্ট থেকে আসে" তবে অবশ্যই "ব্যবহারকারী 127.0.0.1" থেকে আসে না।

পরিবর্তে "127.0.0.1" থেকে সার্ভারের সাথে সংযোগ স্থাপন করতে, কমান্ড লাইনে এটি চালান

mysql -pbar -ufoo --bind-address=127.0.0.1 --protocol=TCP

যদি আপনি ছেড়ে চলে যান --protocol=TCPতবে mysqlকমান্ডটি ইউনিক্স ডোমেন সকেটটি ব্যবহার করার চেষ্টা করবে। আপনি আরও বলতে পারেন:

mysql -pbar -ufoo --bind-address=127.0.0.1 --host=127.0.0.1

দুটি সংযোগ একটি লাইনে চেষ্টা করে:

export MYSQL_PWD=bar; \
mysql -ufoo --protocol=SOCKET --execute="SELECT 1"; \
mysql -ufoo --bind-address=127.0.0.1 --host=127.0.0.1 --execute="SELECT 1"

(পাসওয়ার্ডটি পরিবেশে সেট করা হয়েছে যাতে এটি mysqlপ্রক্রিয়াতে প্রেরণ করা হয় )

সন্দেহের ক্ষেত্রে যাচাইকরণ

টিসিপি / আইপি সকেট বা ইউনিক্স ডোমেন সকেটের মাধ্যমে সংযোগটি যায় কিনা তা সত্যই যাচাই করতে

  1. এর আউটপুট পরীক্ষা করে মাইএসকিএল ক্লায়েন্ট প্রক্রিয়ার পিআইডি পান ps faux
  2. চালান 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এখন কেবল ইউনিক্স ডোমেন সকেটের অর্থ, আর আর 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 থেকে সংযুক্ত করুন: ঠিক আছে

( মাইএসকিউএল ৫.7: .2.২.৪ অনুসারে অ্যাক্সেস কন্ট্রোল, মঞ্চ ১: সংযোগ যাচাইকরণ , খালি স্ট্রিং''র অর্থ "কোনও হোস্ট" তবে '%' এর পরে বাছাই করা হয় ))

কেস 5: হোস্ট = '192.168.0.1' (অতিরিক্ত পরীক্ষা)

('192.168.0.1' আমার মেশিনের একটি আইপি ঠিকানা, আপনার ক্ষেত্রে যথাযথভাবে পরিবর্তন করুন)

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 থেকে সংযোগ করুন: ব্যর্থতা

এজ কেস বি: হোস্ট = '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;

6
এটির একটি উপসংহার দরকার যা এটি স্পষ্ট করে দেয় যে উত্তরগুলি বাক্যটি কোডটি বোঝার প্রয়োজন ছাড়াই আসলে কী বলছে।
প্রমিথিউস

8

আপনি যদি user@'%'লোকালহোস্ট ব্যবহার থেকে সংযোগ করতে চান mysql -h192.168.0.1 -uuser -p


6

শতাংশ প্রতীকটির অর্থ: যে কোনও হোস্ট, দূরবর্তী এবং স্থানীয় সংযোগ সহ।

লোকালহোস্ট কেবল স্থানীয় সংযোগের অনুমতি দেয়।

(তাই শুরু করার জন্য, আপনার যদি আপনার ডাটাবেসে দূরবর্তী সংযোগের প্রয়োজন না হয় তবে আপনি এখনই @ '%' ব্যবহারকারীর হাত থেকে মুক্তি পেতে পারেন)

সুতরাং, হ্যাঁ, তারা ওভারল্যাপ করছে, কিন্তু ...

... উভয় ধরণের অ্যাকাউন্ট সেট করার একটি কারণ রয়েছে, এটি মাইএসকিএল ডক্সে ব্যাখ্যা করা হয়েছে: http://dev.mysql.com/doc/refman/5.7/en/adding-users.html

আপনার লোকালহোস্টে যদি আপনার কোনও বেনামি ব্যবহারকারী থাকে তবে আপনি এটির সাহায্যে তা দেখতে পারেন:

select Host from mysql.user where User='' and Host='localhost';

এবং যদি আপনি কেবল ব্যবহারকারী '@'% (এবং আপনি অ্যাপ্লিকেশন @ 'লোকালহোস্ট' না) তৈরি করেন, তবে যখন অ্যাপ্লিকেশনটি মাইএসকিএল ব্যবহারকারী স্থানীয় হোস্টের সাথে সংযুক্ত হন, বেনামে ব্যবহারকারীর অ্যাকাউন্টটি ব্যবহার করা হয় (এটি আপনার অ্যাপ্লিকেশনটির উপর অগ্রাধিকার পেয়েছে @ '%' ব্যবহারকারী)।

এবং এর জন্য সমাধানটি (যেমন অনুমান করতে পারে) অ্যাপ্লিকেশন @ 'লোকালহোস্ট' তৈরি করা (যা স্থানীয় হোস্ট বেনামে ব্যবহারকারীর পক্ষে আরও নির্দিষ্ট এবং এটি যদি আপনার অ্যাপ্লিকেশন লোকালহোস্ট থেকে সংযুক্ত হয় তবে ব্যবহৃত হবে)।


5

এখন পর্যন্ত সরবরাহ করাগুলির জন্য কিছুটা আলাদা উত্তর দিতে যাচ্ছি।

আপনার যদি আপনার ব্যবহারকারীদের টেবিলে লোকালহোস্ট থেকে কোনও বেনামি ব্যবহারকারীর জন্য সারি থাকে ''@'localhost'তবে এটি ওয়াইল্ডকার্ড হোস্টের সাথে আপনার ব্যবহারকারীর চেয়ে বেশি নির্দিষ্ট হিসাবে বিবেচিত হবে 'user'@'%'। এজন্য এটি সরবরাহ করাও প্রয়োজন 'user'@'localhost'

আপনি এই পৃষ্ঠার নীচে আরও বিশদে এটি ব্যাখ্যা দেখতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.