mysql - هذه - لايستجيب نظرا لوجود برنامج نصي يعمل منذ مدة طويلة




قم بقمع رسائل التحذير باستخدام mysql من داخل Terminal ، لكن كلمة المرور مكتوبة في البرنامج النصي bash (11)

عندما حاولت تشغيل الأمر التالي على 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 من homebrew.


أستخدم شيئًا مثل:

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


أنا شخصياً ، استخدم برنامج التفاف البرنامج النصي لالتقاط هذا الخطأ. هنا هو نموذج التعليمات البرمجية:

#!/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 الخاص بك هو طريقة 5.6.xa لتجنب أن تكون رسالة WARNING تستخدم أدوات dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html :

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

ثم يمكنك استخدام البرنامج النصي shell الخاص بك:

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

بدلا من:

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

إذا كنت ترغب في استخدام كلمة مرور في سطر الأوامر ، فقد وجدت أن هذا يعمل على تصفية رسالة الخطأ المحددة:

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

انها أساسا إعادة توجيه الخطأ القياسي إلى الإخراج القياسي - واستخدام grep لإسقاط كافة الأسطر التي تطابق "تحذير: استخدام كلمة مرور".

بهذه الطريقة ، يمكنك رؤية أي مخرجات أخرى ، بما في ذلك الأخطاء. أستخدم هذا للنصوص النصية المختلفة ، إلخ.


الطريقة الأسهل هي

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

بديل آخر هو استخدام sshpass لاستدعاء mysql ، على سبيل المثال:

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

تتمثل إحدى الطرق الملائمة (ولكنها غير آمنة أيضًا) في الاستخدام:

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

لاحظ أن المستندات الرسمية توصي ضدها.
انظر 6.1.2.1 إرشادات المستخدم النهائي لأمان كلمة المرور (دليل Mysql للإصدار 5.6) :

تخزين كلمة المرور الخاصة بك في متغير البيئة MYSQL_PWD

يجب اعتبار هذه الطريقة في تحديد كلمة مرور MySQL غير آمنة للغاية ويجب عدم استخدامها. تتضمن بعض إصدارات ps خيارًا لعرض بيئة العمليات الجارية. في بعض الأنظمة ، إذا قمت بتعيين MYSQL_PWD ، يتم عرض كلمة المرور الخاصة بك لأي مستخدم آخر يقوم بتشغيل ps . حتى في الأنظمة التي لا تحتوي على مثل هذه النسخة من ps ، فمن غير الحكمة أن نفترض أنه لا توجد طرق أخرى يمكن للمستخدمين من خلالها فحص بيئات العمليات.


حل آخر (من برنامج نصي ، على سبيل المثال):

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

الخيار -i'' متوفر هنا للتوافق مع نظام التشغيل Mac OS X. يمكن أن تستخدم أنظمة تشغيل UNIX القياسية -i


من 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

يمكنك أيضًا تشغيل 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}
"

هذا يبدأ جلسة توقع والتي يمكن استخدامها في البرامج النصية للتفاعل مع المطالبات

انظر هذا المنصب


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