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


273

जब मैंने टर्मिनल के भीतर MySQL पर निम्न कमांड चलाने की कोशिश की:

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

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

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

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

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

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

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

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

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

मैं OS X 10.9.1 Mavericks पर हूं और होमब्रे से MySQL 5.6 का उपयोग करता हूं।


14
अनुशंसित तरीका यह है कि आप अपना पासवर्ड एक विकल्प फ़ाइल (जैसे smth ) [client] password=my_passwordमें स्टोर करें ~/.my.cnf। निश्चित रूप से इसके कुछ सुरक्षा निहितार्थ भी हैं, लेकिन कम से कम यह किसी के लिए भी सुलभ नहीं है जो इसे चला सकता है ps, और आपके पास फ़ाइल अनुमतियों के साथ इस पर नियंत्रण है।
एंटन कोवलेंको

4
mysql -u root password root -e "statement" > /dev/null?

ओह, आप भी पायथन जैसे कुछ का उपयोग कर सकते हैं pexcept। यह टर्मिनल इंसर्शन कर सकता है और फीडबैक भी दे सकता है जो कमांड देता है। इस तरह से आप उस वर्बोज़ आउटपुट और वास्तविक आउटपुट की स्ट्रिप को छोड़ सकते हैं जो आप चाहते हैं :)

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

2
अनुशंसित विधि के लिए व्हिस्की
एंथनी

जवाबों:


249

यदि आपका MySQL क्लाइंट / सर्वर संस्करण 5.6.xa तरीका है जिससे बचने के लिए मैसेज mysql_config_editor टूल्स का उपयोग कर रहे हैं :

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

फिर आप अपनी शेल स्क्रिप्ट में उपयोग कर सकते हैं:

mysql --login-path=local  -e "statement"

के बजाय:

mysql -u username -p pass -e "statement"

28
याद रखें कि --login-pathअन्य सभी तर्कों से पहले आना होगा। मैं कोशिश कर रहा था mysqldump --tables --login-path=localऔर त्रुटि हो रही थी unknown variable 'login-path=local'
तूलियो

Mysql कमांड लाइन क्लाइंट डिफ़ॉल्ट रूप से 'क्लाइंट' लॉगिन पथ के तहत दिखेगा। आप छोटे बदलाव करके "mysql -e 'स्टेटमेंट" के निर्देशों को सरल बना सकते हैं।
मॉर्गन टॉकर

2
यह ठीक काम कर रहा है अगर हम सीधे शेल फ़ाइल को निष्पादित करते हैं लेकिन काम नहीं करते हैं तो crontab से बुलाया जाता है
नबील अरशद

1
@NabeelArshad मुझे लगता है कि है कि इस वजह से अपने crontab में उपयोगकर्ता के लिए "घर" सेट नहीं है (ENV सामान्य रूप में वार्स) तो crontab में ग्राहक सही ~ / .mylogin.cnf ढूँढने में सक्षम नहीं है
क्रिस्टियन पोर्टा

1
@NamGVU, मुझे यकीन नहीं है, हालांकि, मेरा मानना ​​है कि यह समाधान एन्क्रिप्टेड पासवर्ड को संग्रहीत करता है।
zhekaus

209

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

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


12
नोट: --defaults-extra-fileपहला विकल्प होना चाहिए अन्यथा mysql के साथ शिकायत करता है mysqldump: unknown variable 'defaults-extra-file
पाविक

4
स्वीकृत उत्तर के लिए बहुत बढ़िया विकल्प। निश्चित रूप से MYSQL_PWDचर सेट नहीं है ....
DudeOnRock

1
निश्चित रूप से 5.6 से नीचे के संस्करणों के लिए एक अच्छा विकल्प। अन्यथा, मैं स्वीकृत उत्तर के साथ जाना चाहूंगा।
डेक्निफिन

21
एक अस्थायी .cnf फ़ाइल बनाने का एक विकल्प बैश में यह करना है mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement":। चूंकि printfबैश द्वारा सीधे निष्पादित किया जाता है, इसलिए यह दिखाई नहीं देता है ps
डेव जेम्स मिलर

3
मुझे इसके --defaults-fileबजाय उपयोग करने की आवश्यकता थी --defaults-extra-file, क्योंकि बाद वाले ने ~ / .my.cnf में सेटिंग्स को वरीयता दी।
रोजर ड्यूक

185

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

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

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

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

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


6
यह मेरी बैश स्क्रिप्ट में काम नहीं करता है:Access denied for user 'root'@'localhost' (using password: NO)
rubo77

24
एक स्क्रिप्ट में, आपको करने की आवश्यकता है export MYSQL_PWD=whatever
दंगा

2
क्योंकि मेरी क्वेरी बहुत जल्दी है, मैंने इस विकल्प का विकल्प चुना। फिर मैंने क्वेरी निष्पादित करने के बाद इसे कुछ फर्जी पर सेट किया।
टिमएच -

11
एक स्क्रिप्ट में आपको दौड़ने की जरूरत नहीं है export, बस उसे एक लाइन पर रखें:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD

1
@JD: MySQL 5.7.21 के साथ Ubuntu 16.04 में मेरे लिए काम करता है।
mivk

70

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

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

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

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


यह एक-लाइनर कार्यों में उपयोग के लिए एक उत्कृष्ट समाधान है जिसे अन्य कार्यों में कहा जाता है जैसे कि कैपिस्ट्रानो की तैनाती के लिए एक रेक कार्य बनाना।
जेकगोल्ड

2
उस संदेश को म्यूट करने के लिए उत्कृष्ट और सरल, MySQL सेटअप में कुछ भी छूने की आवश्यकता नहीं है।
अंजकेल

मैं इसे mysqldump के साथ कैसे उपयोग करूँगा जहाँ मेरे पास पहले से ही SQL के लिए रीडायरेक्ट है?
मैक्रोमैन

1
यहाँ अन्य लोगों की तुलना में यह वास्तव में बुरा समाधान है। यह MySQL के किसी भी बाद के संस्करण के साथ विफल हो सकता है पाठ को बदलना चाहिए, दूसरे स्थान पर भी काम नहीं कर सकता है।
yktoo

42

यहां बताया गया है कि कैसे मैंने अपने दैनिक 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

कोई और अधिक उजागर पासवर्ड नहीं।


10

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

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

43
समस्या यह है कि यह आपकी स्क्रिप्ट में वैध त्रुटियों को भी दबा देगा।
man910

4
इसके अलावा, आप उस त्रुटि को लॉग करने के लिए एक लॉग फ़ाइल 2> /var/log/myscript.log बना सकते हैं।
स्कमासेले

1
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."प्रश्न में केवल चेतावनी का उपयोग करने के लिए उपयोग करें
हाफेनक्रानिक

10

लॉगिन पथ निर्दिष्ट करते समय पासवर्ड में पास करने के लिए आप अपनी स्क्रिप्ट में mysql_config_editor भी चला सकते हैं

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

यह एक उम्मीद सत्र शुरू करता है जिसका उपयोग लिपियों में संकेतों के साथ बातचीत करने के लिए किया जा सकता है

इस पोस्ट को देखें


क्या वास्तव में वहाँ होने का मतलब '>' है?
डेविड गुडविन

हाँ '>' का अर्थ वहाँ है ताकि mysql_config_editor stdout से इनपुट ले। क्या stdout से mysql_config_editor को पास किया जा रहा है, वह पासवर्ड है जिसे आप चाहते हैं कि यह उपयोगकर्ता बिना '>' के है, फिर क्या होता है कि इको कमांड पार्स हो जाती है और जो आपको दिखाई देगा वह सब कुछ इको कमांड के बाद है
phylanx

तो, आप पाइप ऑपरेटर "|", सही का उपयोग करने का मतलब है? कम से कम, * nix और DOS में, ">" STDOUT को कैप्चर करेगा और वर्तमान वर्किंग डायरेक्टरी में "mysql_config_editor" नामक फाइल पर लिख देगा।
२०:०२ पर जय दंसंद

हां, आप सही हैं, मैंने अपना मूल उत्तर संपादित किया है
फाइलनक्स

7

ठीक है, अस्थायी फ़ाइलों या कुछ भी बिना समाधान:

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"

यह वैसा ही है जैसा दूसरों ने उल्लेख किया है, लेकिन यहां आपको एक वास्तविक फ़ाइल की आवश्यकता नहीं है, कमांड का यह हिस्सा फ़ाइल को फेक करता है: <(echo ...) (नोटिस में बीच में कोई जगह नहीं है)<(


यह काम नहीं करता है यदि आपके पास पहले से ही एक पासवर्ड प्रविष्टि के साथ एक .my.cnfफ़ाइल है~/.
santiago arizti

5
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 अलग-अलग SQL सर्वर से कनेक्ट करने के लिए कई "व्यक्तित्व" सेट करना आसान बनाता है। जब आप किसी क्लाइंट प्रोग्राम का आह्वान करते हैं, तो इनमें से किसी को भी --login-path विकल्प का उपयोग करके नाम द्वारा चुना जा सकता है। उदाहरण के लिए, स्थानीय सर्वर से कनेक्ट करने के लिए, इस कमांड का उपयोग करें:

shell> mysql --login-path=local

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

shell> mysql --login-path=remote

क्या होगा यदि मैं www-data उपयोगकर्ता के रूप में mysqldump कमांड निष्पादित करना चाहता हूं? www-data की कोई घर निर्देशिका नहीं है ... मैं www-data उपयोगकर्ता के लिए mysql_config_editor कैसे सेटअप करूं?
lewis4u

5

से https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html

3

एक अन्य विकल्प mysql को आह्वान करने के लिए sshpass का उपयोग करना है, जैसे:

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

काम करने लगता है, लेकिन आपको कमांड लाइन से 'उपयोगकर्ता नाम' निकालना है, नहीं?
e2-e4

3

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

#!/bin/sh

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

3
जबकि यह उत्तर थोड़ा जटिल है, मैंने इसे सिर्फ इसलिए उकेरा क्योंकि इससे मुझे ऐसे उत्तर देखने को मिलते हैं जो स्पष्ट रूप से गलत नहीं हैं या कोई टिप्पणी नहीं करने के लिए थोड़ा अपरंपरागत हो रहे हैं! कोई आश्चर्य नहीं कि डेविड ने किसी अन्य प्रश्न का उत्तर नहीं दिया है! वह कूद गया और एक उपन्यास समाधान के साथ मदद करने की कोशिश की और बिना किसी स्पष्टीकरण के साथ पटक दिया गया है! फू अनाम downvoters जो टिप्पणी नहीं छोड़ते हैं!
जेरेमी डेविस

3
+1 जेरेमी डेविस सहमत हैं। यह जटिल है, लेकिन जब कोई अन्य विकल्प नहीं छोड़ा जाता है तो यह स्वीकार्य हो सकता है। यह निश्चित रूप से गलत नहीं है, चेतावनियों को बंद करने के विपरीत जो कभी भी सबसे बेवकूफ विचार है!
बेन

1
@JeremyDavis हाँ, यह दृढ़ था, मुख्यतः क्योंकि मैं काम दिखाना चाहता था। यह संभवतः किसी भी कोष्ठक के बिना किया जा सकता है, लेकिन कम स्पष्ट हो सकता है। स्टैक एक्सचेंज के सभी में यह मेरी पहली गैर-पढ़ने वाली गतिविधि थी ... जिसके बाद मैंने इसे लंबे समय तक नहीं छुआ। आपके कमेंट की तारीफ जरूर हुई।
डेविड जी।

@DavidG। - खुशी है कि मेरी टिप्पणी आपके लिए महत्वपूर्ण थी। यह देखने के लिए भी शानदार है कि आप वापस आ गए हैं और आपका उत्तर अब सकारात्मक क्षेत्र में है। व्यक्तिगत रूप से, मुझे नहीं लगता है कि बिना टिप्पणी के मतदान की अनुमति दी जानी चाहिए ... किसी को सीखने का मतलब कैसे होता है जब वे जाने के लिए पटक दिए जाते हैं !!!
जेरेमी डेविस

ऐसा कहने के बाद, आपके उत्तर पर फिर से विचार करते हुए, मुझे यकीन नहीं है कि एक अस्थायी समस्या के लिए एक स्थायी समाधान (अनिवार्य रूप से mysql को लपेटना) एक ही स्क्रिप्ट में उपयोग के लिए एक त्रुटि संदेश को दबाने का सबसे अच्छा तरीका है। IMO स्क्रिप्ट के भीतर एक फ़ंक्शन में mysql को लपेटता है (आपके तरीके का उपयोग यहां ठीक होगा) एक बेहतर दृष्टिकोण है। मेरी 2 सी ... :)
जेरेमी डेविस

3

यहाँ एक स्क्रिप्ट / बिन / श में डॉकर के लिए एक समाधान है:

docker execute [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[क्लाइंट]"> /root/mysql-credentials.cnf'

docker execute [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

docker निष्पादित [MYSQL_CONTAINER_NAME] sh -c 'exec echo "पासवर्ड = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker execute [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file = / root / mysql-credentials.cnf --all-database'

[MYSQL_CONTAINER_NAME] को बदलें और सुनिश्चित करें कि आपके कंटेनर में पर्यावरण चर MYSQL_ROOT_PASSWORD सेट है।

आशा है कि यह आपकी मदद करेगा जैसे यह मेरी मदद कर सकता है!


बुरा नहीं। मैंने अभी-अभी रिटर्न के साथ एक कॉल docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'का उपयोग किया है, उदाहरण के लिए --defaults-fileयह पहले से ही रूट को भी पिक करता है।
मैथ्यू विलकोक्सन 20

3

आप मानक त्रुटि STDERR आउटपुट को / dev / null पर पुनर्निर्देशित भी कर सकते हैं

तो बस करो:

mysql -u $user -p$password -e "statement" 2> /dev/null


7
मैं इस विधि से बचता हूँ क्योंकि यह कानूनी त्रुटियों को पकड़ने में कठिन होगा
व्लादिमीर हैबन

1

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

#!/bin/bash

#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump $@ 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

1

पावरशेल ( pwsh, नहीं bash) के लिए, यह काफी एक रब-गोल्डबर्ग समाधान था ... मेरा पहला प्रयास कॉल को mysqlएक try/catchफ़ंक्शन में लपेटने का था , लेकिन पावरशेल त्रुटि हैंडलिंग में कुछ अजीब व्यवहार के कारण , यह व्यवहार्य नहीं था।

इसका समाधान यह था कि $ErrorActionPreferenceसंयोजन और कैप्चर STDERRऔर STDOUTशब्द के लिए पार्स ERRORऔर आवश्यकतानुसार फिर से फेंकने के लिए सिर्फ लंबे समय तक ओवरराइड किया जाए । जिस कारण से हम पकड़ नहीं सकते और छोड़ रहे थे "^mysql.*Warning.*password", क्योंकि PowerShell हैंडल और त्रुटि को एक स्ट्रीम के रूप में उठाता है, इसलिए आपको फ़िल्टर करने और पुन: फेंकने के लिए इसे सभी पर कब्जा करना होगा । : /

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

नोट: PowerShell यूनिक्स के लिए उपलब्ध है, इसलिए यह समाधान क्रॉस-प्लेटफ़ॉर्म है। इसे bashकुछ मामूली वाक्यविन्यास संशोधनों के साथ अनुकूलित किया जा सकता है ।

चेतावनी: ऐसे दर्जनों किनारे-मामले हैं जहां यह गैर-अंग्रेजी त्रुटि संदेश या कथन के रूप में काम नहीं करेगा जो शब्द ERRORको आउटपुट में कहीं भी लौटाता है , लेकिन यह mysqlबम को बिना बम किए बेसिक कॉल के लिए चेतावनी को निगलने के लिए पर्याप्त था पूरी स्क्रिप्ट। उम्मीद है कि दूसरों को यह उपयोगी लगे।

यह अच्छा होगा यदि mysqlबस इस चेतावनी को दबाने के लिए एक विकल्प जोड़ा जाए।


1

यदि आप अपने कार्यों, या किसी अन्य प्लेटफ़ॉर्म पर जहाँ आप mylogin.cnfफ़ाइल माँगते हैं, शेड्यूल करने के लिए रंडेक का उपयोग करते हैं, तो मैंने sql कॉल के साथ आगे बढ़ने से पहले फ़ाइल के लिए एक नया स्थान प्रदान करने के लिए निम्नलिखित शेल कोड का सफलतापूर्वक उपयोग किया है:

if test -f "$CUSTOM_MY_LOGINS_FILE_PATH"; then
   chmod 600 $CUSTOM_MY_LOGINS_FILE_PATH
   export MYSQL_TEST_LOGIN_FILE="$CUSTOM_MY_LOGINS_FILE_PATH"
fi

...

result=$(mysql --login-path=production -NBA -D $schema -e "$query")

MYSQL_TEST_LOGIN_FILEएक पर्यावरण चर कहां है जो डिफ़ॉल्ट एक से अलग फ़ाइल पथ पर सेट किया जा सकता है।

यह विशेष रूप से उपयोगी है यदि आप एक कांटे की प्रक्रिया में चल रहे हैं और $HOMEनिर्देशिका में फ़ाइलों को स्थानांतरित या कॉपी नहीं कर सकते हैं ।

यहाँ प्रलेखन देखें।


0

सबसे अच्छा उपाय उर्फ ​​का उपयोग करना है:

alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

उदाहरण, इसे अपनी स्क्रिप्ट में रखें:

alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

फिर बाद में अपनी स्क्रिप्ट में डेटाबेस लोड करने के लिए:

drupal-mysql database_name < database_dump.sql

एक बयान चलाने के लिए:

drupal-mysql -e "EXEC SOMESTATEMENT;"

इसके बाद अलियास को अलियास करें:
नील डेविस

अगर आप स्क्रिप्ट के अंदर किसी फंक्शन के अंदर mysql को कॉल कर रहे हैं तो FYI करें।
14:36 ​​पर user3616725

0

सहायक को परिभाषित करें:

remove-warning () {
    grep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
}

इसका इस्तेमाल करें:

mysql -u $user -p$password -e "statement" 2>&1 | remove-warning

Tachaan! आपका कोड साफ और पढ़ने में अच्छा है

(बैश के साथ परीक्षण किया गया)


-1

एक और समाधान (एक स्क्रिप्ट से, उदाहरण के लिए):

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

-i''विकल्प यहाँ मैक ओएस एक्स मानक यूनिक्स OSes के साथ संगतता के सीधे उपयोग कर सकते हैं के लिए है-i


1
पासवर्ड अभी भी 'sed' की कमांड लाइन पर है, इसलिए प्रक्रिया लिस्टिंग में दिखाई देता है, भले ही केवल संक्षेप में।
एंथनी

-1

मेरे पास जो समस्या थी वह आउटपुट को बैश स्क्रिप्ट में सशर्त उपयोग कर रही थी।

यह सुरुचिपूर्ण नहीं है, लेकिन एक docker env में यह वास्तव में मायने नहीं रखना चाहिए। मूल रूप से यह सब उस आउटपुट को अनदेखा करता है जो अंतिम पंक्ति में नहीं है। आप awk के साथ भी ऐसा ही कर सकते हैं, और सभी को लौटाने के लिए बदल सकते हैं लेकिन पहली पंक्ति आदि।

यह केवल अंतिम पंक्ति देता है

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

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


-1

सबसे आसान तरीका:

mysql -u root -p YOUR_DATABASE

इसे दर्ज करें और आपको अपना पासवर्ड टाइप करना होगा।

नोट: हाँ, अर्धविराम के बिना।


-3

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

# 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

का आनंद लें!


1
बस ध्यान रखें कि यह सभी पासवर्ड संदेशों को दबाएगा, न कि केवल पासवर्ड चेतावनी।
साइमन ईस्ट

-3

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


1
इसका मतलब यह भी है कि आपको कुछ गलत होने पर रिपोर्ट नहीं मिलती है!
एंथनी

इसके अलावा, आप शायद चाहते थे 2>/dev/null। उपयोग करने से 2> nullआउटपुट को वर्तमान निर्देशिका में "null" नामक फ़ाइल में डाल दिया जाएगा।
thelogix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.