टर्मिनल के भीतर से mysql का उपयोग कर चेतावनी संदेश दबाएं, लेकिन बैश स्क्रिप्ट में पासवर्ड लिखा गया है




bash shell (11)

उदाहरण के लिए / dev / null का उपयोग करके आप mySQL निष्पादित कर सकते हैं और चेतावनी और त्रुटि संदेशों को दबा सकते हैं:

# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null

# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

कहा पे:

${USERNAME} - existing mysql user

${PASSWORD} - password

${HOST}     - ip or hostname, for example 'localhost'

${DATABASE} - name of database

${STATEMENT}- SQL command

${FILEPATH} - Path to the SQL-script

का आनंद लें!

जब मैंने टर्मिनल के भीतर से MySQL पर निम्न आदेश चलाने का प्रयास किया:

mysql -u $user -p$password -e "statement"

निष्पादन अपेक्षा के अनुसार काम करता है, लेकिन यह हमेशा एक चेतावनी जारी करता है:

चेतावनी: कमांड लाइन इंटरफ़ेस पर पासवर्ड का उपयोग असुरक्षित हो सकता है।

हालांकि, मुझे पर्यावरण परिवर्तनीय ( $password ) का उपयोग करके ऊपर दिए गए कथन का संचालन करना है जो मेरा पासवर्ड संग्रहीत करता है, क्योंकि मैं टर्मिनल के भीतर से बैश स्क्रिप्ट में इसे क्रमशः चलाने के लिए चाहता हूं, और मुझे निश्चित रूप से प्रॉम्प्ट का इंतजार करने का विचार पसंद नहीं है दिखा रहा है और मुझे एक ही स्क्रिप्ट में 50 या 100 बार अपना पासवर्ड इनपुट करने के लिए मजबूर कर रहा है। तो मेरा सवाल यहाँ है:

  • चेतावनी दबाने के लिए क्या संभव है? जैसा कि मैंने कहा है, कमांड ठीक से काम करता है, लेकिन जब मैं लूप करता हूं और 50 या 100 बार कमांड चलाता हूं तो खिड़की बहुत गन्दा हो जाती है।

  • क्या मुझे चेतावनी संदेश का पालन करना चाहिए और मेरी स्क्रिप्ट में अपना पासवर्ड नहीं लिखना चाहिए? यदि ऐसा है, तो क्या मुझे हर बार प्रॉम्प्ट करने के लिए मजबूर करने के लिए मुझे अपना पासवर्ड टाइप करना होगा?

रनिंग man mysql केवल कहने में मदद नहीं करता है

--show-warnings
यदि कोई है तो प्रत्येक कथन के बाद चेतावनियों को दिखाया जाए। यह विकल्प इंटरैक्टिव और बैच मोड पर लागू होता है।

और अगर मैं कुछ याद नहीं कर रहा हूं, तो कार्यक्षमता को बंद करने के तरीके के बारे में कुछ भी नहीं बताता है।

मैं ओएस एक्स 10.9.1 मैवरिक्स पर हूं और होमब्रू से MySQL 5.6 का उपयोग करता हूं।


एक और विकल्प mysql का आह्वान करने के लिए sshpass का उपयोग करना है, उदाहरण के लिए:

sshpass -p topsecret mysql -u root -p username -e 'statement'

एक विधि जो सुविधाजनक है (लेकिन समान रूप से असुरक्षित) का उपयोग करना है:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

ध्यान दें कि आधिकारिक दस्तावेज़ इसके खिलाफ अनुशंसा करते हैं।
पासवर्ड सुरक्षा के लिए 6.1.2.1 अंत उपयोगकर्ता दिशानिर्देश देखें (संस्करण 5.6 के लिए MySQL मैनुअल) :

MYSQL_PWD पर्यावरण चर में अपना पासवर्ड संग्रहीत करना

अपने MySQL पासवर्ड को निर्दिष्ट करने की यह विधि बेहद असुरक्षित मानी जानी चाहिए और इसका उपयोग नहीं किया जाना चाहिए। पीएस के कुछ संस्करणों में चल रही प्रक्रियाओं के वातावरण को प्रदर्शित करने का विकल्प शामिल है। कुछ सिस्टमों पर, यदि आप MYSQL_PWD सेट MYSQL_PWD , तो आपका पासवर्ड किसी अन्य उपयोगकर्ता के सामने आ जाता है जो ps चलाता है। यहां तक ​​कि पीएस के इस तरह के संस्करण के बिना सिस्टम पर, यह मानना ​​मूर्ख नहीं है कि कोई अन्य तरीका नहीं है जिसके द्वारा उपयोगकर्ता प्रक्रिया वातावरण की जांच कर सकते हैं।


एक साधारण कामकाज स्क्रिप्ट। इस "mysql" को नाम दें, और इसे "/ usr / bin" से पहले अपने पथ में रखें। अन्य आदेशों के लिए स्पष्ट रूप, या चेतावनी पाठ अलग है।

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "[email protected]"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1

मैं कुछ इस तरह का उपयोग करता हूं:

mysql --defaults-extra-file=/path/to/config.cnf

या

mysqldump --defaults-extra-file=/path/to/config.cnf 

जहां config.cnf में शामिल हैं:

[client]
user = whatever
password = whatever
host = whatever

यह आपको विभिन्न कॉन्फ़िगरेशन फ़ाइलों की अनुमति देता है - विभिन्न सर्वर / भूमिकाओं / डेटाबेस के लिए। ~ / .my.cnf का उपयोग करने से आपको केवल कॉन्फ़िगरेशन का एक सेट मिल जाएगा (हालांकि यह डिफ़ॉल्ट का एक उपयोगी सेट हो सकता है)।

यदि आप डेबियन आधारित डिस्ट्रो पर हैं, और रूट के रूप में चल रहे हैं, तो आप उपरोक्त को छोड़ सकते हैं और बस /etc/mysql/debian.cnf का उपयोग करने के लिए ...:

mysql --defaults-extra-file=/etc/mysql/debian.cnf


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

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

यह मूल रूप से मानक आउटपुट में मानक त्रुटि को रीडायरेक्ट कर रहा है - और "चेतावनी: पासवर्ड का उपयोग करना" से मेल खाने वाली सभी पंक्तियों को छोड़ने के लिए grep का उपयोग करना।

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


यह मेरे लिए काम करता $(mysql_command) बाद बस 2> null जोड़ा गया, और यह केवल त्रुटियों और चेतावनी संदेशों को दबाएगा।


यहां बताया गया है कि मुझे अपने दैनिक mysqldump डेटाबेस बैकअप के लिए और अधिक सुरक्षित रूप से काम करने के लिए मेरी बैश स्क्रिप्ट कैसे मिली। यह क्रिस्टियन पोर्टा के महान उत्तर का विस्तार है।

  1. पहले एन्क्रिप्टेड पासवर्ड फ़ाइल सेट अप करने के लिए mysql_config_editor (mysql 5.6+ के साथ आता है) का उपयोग करें। मान लें कि आपका उपयोगकर्ता नाम "db_user" है। शेल प्रॉम्प्ट से चल रहा है:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password
    

    यह पासवर्ड के लिए संकेत देता है। एक बार जब आप इसे दर्ज कर लेंगे, तो उपयोगकर्ता / पास आपके home/system_username/.mylogin.cnf में एन्क्रिप्टेड सहेजे गए हैं

    बेशक, सर्वर पर अपने उपयोगकर्ता नाम पर "system_username" बदलें।

  2. इस से अपनी बैश स्क्रिप्ट बदलें:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
    

    इसके लिए:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
    

कोई और खुला पासवर्ड नहीं।


व्यक्तिगत रूप से, मैं उस त्रुटि को पकड़ने के लिए स्क्रिप्ट रैपर का उपयोग करता हूं। कोड नमूना यहां दिया गया है:

#!/bin/bash

#echo [email protected] | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump [email protected] 2>$ERR_FILE

# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE

# Handle an error
if [ "" != "$ERROR" ]; then

        # Error occured
        if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
                echo $ERROR >&2
                exit 1
        fi
fi

सबसे आसान तरीका है

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null

shell> mysql_config_editor set --login-path=local
     --host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
     --host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here

यह देखने के लिए कि mysql_config_editor ने .mylogin.cnf फ़ाइल में क्या लिखा है, प्रिंट कमांड का उपयोग करें:

shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com

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

जैसा कि पिछले उदाहरणों द्वारा दिखाया गया है, .mylogin.cnf फ़ाइल में एकाधिक लॉगिन पथ हो सकते हैं। इस तरह, mysql_config_editor विभिन्न MySQL सर्वर से कनेक्ट करने के लिए एकाधिक "व्यक्तित्व" सेट करना आसान बनाता है। जब आप क्लाइंट प्रोग्राम का आह्वान करते हैं तो इनमें से किसी भी नाम को बाद में --login-path विकल्प का उपयोग करके चुना जा सकता है। उदाहरण के लिए, स्थानीय सर्वर से कनेक्ट करने के लिए, इस कमांड का उपयोग करें:

shell> mysql --login-path=local

रिमोट सर्वर से कनेक्ट करने के लिए, इस कमांड का उपयोग करें:

shell> mysql --login-path=remote




shell