रूट पासवर्ड के बिना क्रॉन जॉब में mysqldump का उपयोग करना


14

यदि मैं अपने बॉक्स पर रूट पासवर्ड के साथ लॉगिन करता हूं तो मैं बस टाइप कर सकता हूं

mysqldump --all-database और मुझे th अपेक्षित "डंप" मिलेगा।

मैं चलाने और इसे एक बैकअप ड्राइव में डंप करने के लिए cron.daily में नौकरी सेटअप करता हूं। मेरे पास समस्या यह है कि यद्यपि उपयोगकर्ता रूट के रूप में चल रहा है मुझे निम्न संदेश मिलता है

mysqldump: त्रुटि मिली: 1045: उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' के लिए अस्वीकृत (पासवर्ड का उपयोग करते हुए: NO)

जब कनेक्ट करने की कोशिश कर रहा है। मैं स्क्रिप्ट (जो होगा) में mysql डेटाबेस रूट पासवर्ड को हार्ड कोड नहीं करना चाहता।

यह देखते हुए कि मैं अपने बैश शेल में कमांड लाइन पर "mysqldump" टाइप कर सकता हूं, किसी को -u पैरामीटर का उपयोग करने के लिए पास होना होगा। मेरे पास पहले से ही स्क्रिप्ट के शीर्ष पर #! / Bin / bash है।

डेटाबेस से रूट पासवर्ड न मांगने के लिए मैं यहां क्या याद कर रहा हूं?

जवाबों:


12

Mysql सर्वर से कनेक्ट करने के लिए आपको क्रेडेंशियल प्रदान करना होगा। आप उन्हें एक कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट कर सकते हैं, उन्हें कमांड लाइन के माध्यम से पारित कर सकते हैं, या बस खाता बना सकते हैं जिसे क्रेडेंशियल्स की आवश्यकता नहीं है।

बेशक नो-पासवर्ड विकल्प का उपयोग कभी नहीं किया जाना चाहिए, पास-पास कमांड लाइन महान नहीं है क्योंकि जो कोई भी पीएस चला सकता है वह कमांड लाइन को देखने में सक्षम हो सकता है।

अनुशंसित विकल्प यह है कि इसमें क्रेडेंशियल्स के साथ एक mysql कॉन्फ़िगरेशन फ़ाइल बनाई जाए और फिर फ़ाइल सिस्टम अनुमतियों के साथ उस फ़ाइल को सुरक्षित रखें ताकि केवल आपका बैकअप उपयोगकर्ता ही इसे एक्सेस कर सके।

आप इंटरेक्टिव रूप से लॉग इन करते हुए mysql सर्वर में लॉग इन करने में सक्षम हो रहे हैं, ऐसा लगता है कि आपको या तो रूट पासवर्ड सेट नहीं है, या आपके पास एक कॉन्फ़िगरेशन फ़ाइल है जो आपकी स्क्रिप्ट से नहीं मिल रही है। यदि आपके पास एक .my.cnf है तो आपको इसे मैन्युअल रूप से इंगित करने की आवश्यकता हो सकती है। यदि आपके रूट खाते में पासवर्ड सेट नहीं है तो मैं आपको इसे ठीक करने के लिए प्रोत्साहित करूंगा।

अपडेट (2016-06-29) यदि आप mysql 5.6.6 या अधिक चला रहे हैं, तो आपको mysql_config_editor टूल को देखना चाहिए जो आपको एन्क्रिप्टेड फ़ाइल में क्रेडेंशियल्स संग्रहीत करने की अनुमति देता है । मेरे लिए यह उल्लेख करने के लिए जियोवानी का धन्यवाद ।


1
उस विधि को अभी भी सिस्टम पर होने के लिए सादे-पाठ में अनएन्क्रिप्टेड पासवर्ड की आवश्यकता है। यही कारण है कि मैं बचने की कोशिश कर रहा हूं।
मेच सॉफ्टवेयर

> आपके पास या तो रूट पासवर्ड सेट नहीं है, या आपके पास एक कॉन्फ़िगरेशन फ़ाइल है जो आपकी स्क्रिप्ट से नहीं मिल रही है। लेखक स्पष्ट रूप से बताता है कि रूट के लिए एक mysql पासवर्ड है, और वह डेटाबेस को mysqldump कमांड को सप्लाई किए बिना एक्सेस करने का प्रयास कर रहा है: "(पासवर्ड का उपयोग करके: NO)"। इसलिए पहुंच से इनकार किया त्रुटि।
मोनोमेथ

1
@monomyth, लेखक यह भी बताता है कि वह एक पासवर्ड के बिना लॉगिन कर सकता है जबकि अंतःक्रियात्मक रूप से रूट के रूप में लॉग इन कर सकता है। यह मुझे बताता है कि कुछ सही नहीं है।
Zoredache

2
@ एमटेक सॉफ्टवेयर, अपने आप को रूट खाते से बचाने की कोशिश करने का कोई मतलब नहीं है। यदि किसी के पास रूट खाता है तो वे केवल mysql को पुनरारंभ कर सकते हैं और अनुमति प्रणाली को पूरी तरह से बायपास कर सकते हैं।
Zoredache

1
मेरे द्वारा लॉगिन करने में सक्षम होने के कारण रूट खाता 600 अनुमतियों के साथ एक .my.cnf निर्दिष्ट था, इसलिए इस प्रकार शेल का उपयोग हो रहा था। क्रोन हालांकि, फ़ाइल को अनदेखा कर रहा होगा, इसलिए मैंने इस पोस्ट में पैरामीटर को इंगित करने के लिए उपयोग किया।
मेक सॉफ्टवेयर

3

सुरक्षा अस्पष्टता के माध्यम से नहीं की जानी चाहिए। यदि आपको लगता है कि किसी के पास आपके रूट खाते तक पहुंच है, तो इससे कोई फर्क नहीं पड़ता कि रूट का mysql पासवर्ड स्क्रिप्ट में संग्रहीत है या नहीं, क्योंकि आपके पास mysql dumps, या डेटाबेस फ़ाइलों में आपके सभी डेटा उपलब्ध हैं। तो, असली सवाल यह है कि आप क्या करने की कोशिश कर रहे हैं?

यदि आप नहीं चाहते हैं कि दूसरों को एक पासवर्ड मिले, जो उन्हें आपके डेटाबेस में डेटा बदलने देगा, तो आपको उपयुक्त अनुमतियों वाला एक उपयोगकर्ता बनाना होगा ।

यदि आप नहीं चाहते हैं कि mysql पासवर्ड किसी भी स्थानीय खाते द्वारा देखा जाए, तो उस स्क्रिप्ट पर रूट सेट फ़ाइल अनुमतियों को छोड़कर 0700 होना चाहिए और रूट करने के लिए स्वामी होना चाहिए।


1
मुझे लगता है कि जो मुझे अभी भी समझ नहीं आ रहा है वह यह है कि अगर मैं बिना पासवर्ड इनपुट के mysqldump टाइप (रूट प्रॉम्प्ट से) कर सकता हूं, तो मैं इसे क्रॉन जॉब के माध्यम से उसी तरह नहीं चला सकता। क्या टुकड़ा गायब है जो -p पैरामीटर की आवश्यकता है। मैं पासवर्ड को "अस्पष्ट" करने की कोशिश नहीं कर रहा हूं, मैं बस इसे दर्ज करना कभी नहीं चाहूंगा। रूट लॉगिन के लिए कुछ विशेष ही पहुंच की अनुमति दे रहा है, इसलिए यह क्रोन के साथ दोहराया क्यों नहीं जा सकता है?
मेच सॉफ्टवेयर

यदि आप देखते हैं कि आप पासवर्ड के बिना लॉगिन कर सकते हैं और उसी "रूट" उपयोगकर्ता का उपयोग कर पासवर्ड के साथ, यह संभव है कि आपके mysql डेटाबेस में कई रूट उपयोगकर्ता हैं। उनमें से कुछ में पासवर्ड सेट नहीं हो सकता है। आप 'रूट' @ 'लोकलहोस्ट' से पासवर्ड निकाल सकते हैं लेकिन तब न केवल क्रोन आपके डेटाबेस से कनेक्ट हो पाएगा, बल्कि स्थानीय खाते वाला कोई भी। यह एक स्पष्ट पाठ स्क्रिप्ट में पासवर्ड होने से अलग (या बदतर) नहीं है।
मोनोमिथ

मुझे लगता है कि बिंदु यह है कि मेकसवेयर बना रहा था कि मूल रूप से मूल रूप से आपको डेटाबेस फ़ाइलों तक पढ़ने की सुविधा मिलती है, और वे एन्क्रिप्टेड नहीं हैं। इसलिए, रूट उपयोगकर्ता से रूट MySQL पासवर्ड की आवश्यकता केवल सुंदर डेटा को प्रिंट करने के लिए है जो वे अनिवार्य रूप से पहले से ही उपयोग कर सकते हैं "अस्पष्टता के माध्यम से सुरक्षा"। इसके अलावा, अनुमतियों को
गड़बड़ाना

2

आपके शेल का उपयोग यह कर सकता है क्योंकि आपके पास इसे चलाने के लिए एक शेल है, अर्थात जब आप लॉगऑन करते हैं, तो आपकी प्रोफ़ाइल में आपके सभी शेल स्क्रिप्ट चलते हैं।

क्रोन में ऐसी विलासिता नहीं है। जब यह (रूट के रूप में) पर लॉग ऑन होता है तो यह एक डिफ़ॉल्ट शेल के साथ लॉग ऑन होगा। यह किसी को भी दूरस्थ रूप से लॉग इन करने से रोकता है, लेकिन इसका मतलब यह भी है कि कोई भी ऑटो-लॉगिन स्क्रिप्ट नहीं है जो चलाया जाता है।

आप क्रोन के नीचे चलाने के लिए, क्रॉस्टैब को संपादित करने और शेल और होम चर, जैसे जोड़ने के लिए एक शेल सेट कर सकते हैं।

SHELL=/bin/bash
HOME=/root

यदि ये सेट नहीं किए जाते हैं, तो क्रोन शेल और होम डायरेक्टरी के साथ / etc / passwd (जो संभवतः कुछ भी नहीं है, संभवतः / बिन / श) के साथ चलेगा।

यदि आप देखना चाहते हैं कि पर्यावरण क्रोन के रूप में चल रहा है, तो एक क्रॉन जॉब जोड़ें, जो फ़ाइल में एनवी निर्यात करता है, जैसे:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

यदि स्क्रिप्ट रूट द्वारा चलाया जाता है, तो आप अनुमतियाँ 600 और निम्न सामग्री के साथ एक फ़ाइल /root/.my.cnf बना सकते हैं:

[client]
user = DBUSERNAME
password = DBPASSWORD

(जहां आप अपने MySQL उपयोगकर्ता नाम और पासवर्ड दर्ज करते हैं)।

यह फ़ाइल किसी भी mysql कमांड-लाइन टूल द्वारा स्वचालित रूप से पढ़ी जाएगी, यदि इसे रूट के रूप में चलाया जाता है। कमांड-लाइनिया पर इसे प्रदान करने की आवश्यकता नहीं है। 600 अनुमतियाँ इसे चुभने वाली आँखों से बचाती हैं।


1
मैंने पाया कि यह HOW का मामला था हम पासवर्ड के बिना हमारे mysqldump करने में सक्षम थे। तो इसने इस रहस्य को सुलझा दिया कि शेल कैसे कर रहा है, इसलिए क्रोन इसे क्यों नहीं पढ़ रहा है?
मेच सॉफ्टवेयर

1
mysqldump जब क्रॉन से चलाया जाता है तो .my.cnf फ़ाइल का पता लगाने में सक्षम नहीं हो सकता है। उपाय यह है कि my.q.cumpf फ़ाइल में विकल्पों को स्पष्ट रूप से पढ़ने के लिए mysqldump पैरामीटर को जोड़ा जाए, अर्थात-defaults-extra-file = / root / .my.cnf मैंने इसे स्टैक ओवरफ्लो पर दो अन्य उत्तरों से सीखा। देखें stackoverflow.com/a/602054/854680 और stackoverflow.com/a/890554/854680
MikeOnline

1

क्रोन डिबग करने के लिए बहुत निराशाजनक हो सकता है। जब क्रॉन जॉब्स निष्पादित होते हैं, तो उनके पास एक पर्यावरण सेट नहीं होता है जैसे आप एक शेल के साथ प्रदान करते हैं।

क्रोन के लिए सुझाव:

  • सब कुछ के लिए पूर्ण पथ का उपयोग करें - "ECHO = / bin / echo", आदि: (इसे बनाने के लिए शीर्ष पर चर को परिभाषित करें)
  • MAILTO सेट करें, ताकि आपको प्रत्येक नौकरी से एक ईमेल मिले (या किसी फ़ाइल में रीडायरेक्‍ट स्‍ट्रेडर / स्‍टडआउट की जॉब हो)

यदि आपका रूट उपयोगकर्ता इसे शेल से कर सकता है, तो क्रोन इसे करने में सक्षम होना चाहिए। सुनिश्चित करें कि आप कमांड-लाइन पर उपयोग करने के लिए कॉन्फ़िगर फ़ाइल को स्पष्ट रूप से निर्दिष्ट करें।


0

हालाँकि इनमें से कई प्रतिक्रियाएँ सहायक हैं, कई भ्रमित कर रहे हैं क्योंकि यूनिक्स रूट उपयोगकर्ता और mysql रूट उपयोगकर्ता समान नहीं हैं और मूल रूप से उन दोनों के अलावा कोई संबंध नहीं है जो दोनों लॉगिन नाम 'रूट' का उपयोग करते हैं। हो सकता है कि यह स्पष्ट हो, लेकिन ऐसा लगता है कि कुछ प्रतिक्रियाएं दोनों को भ्रमित करती हैं।

एक उपयोगी विकल्प क्या हो सकता है (शायद यह मौजूद है?) Mysqld के लिए क्लाइंट प्रोग्राम जैसे mysql या mysqldump आदि को अनुमति देने के लिए एक रूट के रूप में mysqld के रूट @ localhost पर पहुंचने के लिए बिना रूट @ localhost's (mysql) के पासवर्ड के बिना पासवर्ड की अनुमति होगी। एक my.cnf फ़ाइल या समान में।

मुझे पता है कि कुछ परेशान करता है लेकिन तर्क किसी को भी स्थानीय (mysqld सर्वर के लिए) के रूप में चल रहा है, यूनिक्स रूट किसी भी तरह से, बहुत आसानी से mysqld की सुरक्षा को पारित कर सकता है। और mysnld रूट पासवर्ड 7x24 के साथ my.cnf का होना या यहाँ तक कि mysql रूट पासवर्ड (जहाँ वह पासवर्ड आता है?) के साथ my.cnf को फ्लाई पर बनाना (जैसे, mysqldump करना) मुझे परेशान करता है।

इसके लिए कुछ बुनियादी ढाँचे और सोच की आवश्यकता होगी क्योंकि किसी को mysql पर संचार करने के लिए mysql / mysqldump / etc पर भरोसा करना होगा कि यह वास्तव में मानता है कि यह एक स्थानीय यूनिक्स रूट खाते द्वारा चलाया जा रहा है।

लेकिन उदाहरण के लिए mysqld के यूनिक्स सॉकेट तक ही सीमित है, कोई भी टीसीपी, इस विकल्प के कम से कम अनुशंसित विकल्प के रूप में मदद नहीं कर सकता है। यह स्थापित कर सकता है कि ग्राहक स्थानीय रूप से चल रहा है जो कि संभवतः पर्याप्त नहीं है। लेकिन यह एक विचार की शुरुआत हो सकती है। शायद एक यूनिक्स सॉकेट के ऊपर एक फाइल डिस्क्रिप्टर भेजना एक और टुकड़ा हो सकता है (यदि ऐसा लगता है कि पागल बात की तरह लगता है)।

PS नहीं, मैं यहाँ पर विचार-मंथन करने का प्रयास नहीं करने जा रहा हूँ कि कोई भी गैर-यूनिक्स ऑपरेटिंग सिस्टम पर कैसे काम कर सकता है, यह विचार शायद अन्य OS के लिए अनुवाद करता है।


1
क्रेडेंशियल्स /root/.my.cnfको उचित अनुमतियों के साथ रखने से समस्या का समाधान हो जाता है।
माइकल हैम्पटन

मैं असहमत हूं, अब जो कोई भी उस फ़ाइल तक पहुंच प्राप्त कर सकता है, जिसमें कुछ अन्य सिस्टम दोषों के माध्यम से, mysql रूट pw शामिल है। और वहाँ 24x7 पर हमला किया जाना है, और एक निश्चित फ़ाइल स्थान में (यद्यपि यह माना जाता है कि यह / रूट में नहीं होगा।) लेकिन उदाहरण के लिए जो कोई भी फाइल सिस्टम डंप चलाता है, या किसी को एक्सेस प्राप्त कर सकता है, वह इसे बाहर निकाल सकता है। एक फ़ाइल सिस्टम डंप फ़ाइल। उस मामले में यह एक असंतुष्ट कर्मचारी के लिए एक प्रलोभन की तरह लगता है। मुझे लगता है कि यह एक उचित लक्ष्य है कि कोई भी स्पष्ट पासवर्ड किसी सिस्टम पर, कहीं भी मौजूद नहीं है।
बैरी शीन

हो सकता है कि ऐसा हो, लेकिन आपके द्वारा किया गया प्रस्ताव बहुत बुरा है, क्योंकि यह किसी भी स्थानीय उपयोगकर्ता को तुच्छ होने का दिखावा करने की अनुमति देता है ।
माइकल हैम्पटन

नहीं, मेरा प्रस्ताव था कि उन्हें पहले से ही स्थानीय सर्वर पर यूनिक्स रूट होना चाहिए जिस स्थिति में स्थानीय mysqld mysql या mysqldump आदि पर भरोसा करता है (क्लाइंट) यूनिक्स रूट के रूप में चलाया जा रहा है और उन्हें आगे बढ़ने की अनुमति देता है जैसे कि mysql रूट के रूप में प्रमाणित होगा । जैसा कि मैंने कहा कि अगर वे पहले से ही सर्वर के लिए रूट स्थानीय हैं तो वे कुछ अच्छी तरह से प्रलेखित कमांड ("mysql रूट पासवर्ड रिकवरी") के साथ किसी भी तरह mysql रूट पासवर्ड को पास कर सकते हैं।
बैरी शीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.