ระงับข้อความเตือนโดยใช้ mysql จากภายใน Terminal แต่รหัสผ่านที่เขียนในสคริปต์ทุบตี


273

เมื่อฉันพยายามเรียกใช้คำสั่งต่อไปนี้ใน MySQL จากภายใน Terminal:

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

การดำเนินการทำงานตามที่คาดไว้ แต่จะออกคำเตือนเสมอ:

คำเตือน: การใช้รหัสผ่านบนอินเตอร์เฟสบรรทัดคำสั่งอาจไม่ปลอดภัย

อย่างไรก็ตามฉันต้องทำคำสั่งข้างต้นโดยใช้ตัวแปรสภาพแวดล้อม ( $password) ที่เก็บรหัสผ่านของฉันเพราะฉันต้องการเรียกใช้คำสั่งอย่างซ้ำ ๆ ในสคริปต์ทุบตีจากภายในเทอร์มินัลและฉันไม่ชอบความคิดในการรอให้ปรากฏขึ้น และบังคับให้ฉันใส่รหัสผ่าน 50 หรือ 100 ครั้งในสคริปต์เดียว ดังนั้นนี่คือคำถามของฉัน:

  • เป็นไปได้หรือไม่ที่จะระงับคำเตือน? คำสั่งทำงานอย่างถูกต้องตามที่ระบุไว้ แต่หน้าต่างจะดูยุ่งเหยิงเมื่อฉันวนลูปและรันคำสั่ง 50 หรือ 100 ครั้ง

  • ฉันควรเชื่อฟังข้อความเตือนและอย่าเขียนรหัสผ่านในสคริปต์ของฉัน? หากเป็นเช่นนั้นฉันต้องพิมพ์รหัสผ่านทุกครั้งที่ระบบพรอมต์บังคับให้ฉันทำเช่นนั้นหรือไม่

การวิ่งman mysqlไม่ได้ช่วยพูดเพียงอย่างเดียว

--show-warnings
ทำให้เกิดคำเตือนที่จะแสดงหลังจากแต่ละคำสั่งถ้ามี ตัวเลือกนี้ใช้กับโหมดการโต้ตอบและแบทช์

และไม่ได้กล่าวถึงวิธีการปิดฟังก์ชั่นหากฉันไม่ได้ทำอะไรสักอย่าง

ฉันใช้ OS X 10.9.1 Mavericks และใช้ MySQL 5.6 จาก homebrew


14
วิธีที่แนะนำคือการจัดเก็บรหัสผ่านของคุณในไฟล์ตัวเลือก (smth like [client] password=my_passwordin ~/.my.cnf) แน่นอนว่ามันมีผลกระทบด้านความปลอดภัยเช่นกัน แต่อย่างน้อยก็ไม่สามารถเข้าถึงได้โดยทุกคนที่สามารถเรียกใช้psและคุณสามารถควบคุมได้ด้วยสิทธิ์ของไฟล์
Anton Kovalenko

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

โอ้คุณยังสามารถใช้งาน Python pexceptได้ มันสามารถทำการแทรกเทอร์มินัลและจัดการข้อเสนอแนะที่คำสั่งให้ ด้วยวิธีนี้คุณสามารถข้ามเอาต์พุต verbose และส

6
วิธีที่แนะนำให้ IMO ลงโทษคนที่ทำสิ่งที่ถูกต้องเพื่อปกป้องคนที่ทำสิ่งผิด หากรหัสผ่านถูกเก็บไว้ในไฟล์สคริปต์มันจะไม่แสดงขึ้นพร้อมกับ ps หรือในบันทึกใด ๆ นั่นเป็นวิธีที่ถูกต้องในการทำเช่นนี้ การวางไฟล์ไว้ในไฟล์ภายนอกจะช่วยให้รหัสที่ cron รหัสผ่าน แต่ที่ไม่ดีที่จะเริ่มต้นด้วย ในขณะเดียวกันสคริปต์ที่ทำงานมาหลายปีแล้วก็ล้มเหลวและเราจำเป็นต้องแก้ไขมันเพียงเพราะคำเตือนนี้เกิดขึ้นใน stderr
Nestor Urquiza

2
สำหรับวิธีการที่แนะนำ whcih ไม่เก็บรหัสผ่านในที่ชัดเจนเป็นรายละเอียดในdev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html
แอนโธนี

คำตอบ:


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'
Tulio

ไคลเอนต์บรรทัดคำสั่ง mysql จะดูภายใต้เส้นทางการเข้าสู่ระบบ 'ลูกค้า' โดยค่าเริ่มต้น คุณสามารถทำให้คำสั่ง "mysql -e 'statement'" ง่ายขึ้นโดยทำการเปลี่ยนแปลงเล็กน้อย
Morgan Tocker

2
นี่ทำงานได้ดีถ้าเราเรียกใช้งานเชลล์ไฟล์โดยตรง แต่ไม่ทำงานหากเรียกจาก crontab
Nabeel Arshad

1
@NabeelArshad ฉันคิดว่านี่เป็นเพราะใน crontab ของคุณ "บ้าน" สำหรับผู้ใช้ไม่ได้ตั้งค่า (ENV vars โดยทั่วไป) ดังนั้นใน crontab ลูกค้าจะไม่สามารถหา ~ / .mylogin.cnf ที่ถูกต้องได้
Cristian Porta

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 จะอนุญาตให้คุณมีการตั้งค่าได้เพียงชุดเดียวเท่านั้น (แม้ว่าจะเป็นชุดค่าเริ่มต้นที่มีประโยชน์)

หากคุณอยู่ใน Distbian ที่ใช้ Debian และทำงานเป็น root คุณสามารถข้ามไปด้านบนและใช้ /etc/mysql/debian.cnf เพื่อเข้า ...

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


12
หมายเหตุ: --defaults-extra-fileตัวเลือกที่จะต้องเป็นคนแรกที่มิฉะนั้นข้อมูล mysql mysqldump: unknown variable 'defaults-extra-fileบ่นกับ
pevik

4
ทางเลือกที่ยอดเยี่ยมสำหรับคำตอบที่ยอมรับได้ ไม่ต้องตั้งค่าMYSQL_PWDตัวแปรแน่นอน ....
DudeOnRock

1
ตัวเลือกที่ดีสำหรับรุ่นที่ต่ำกว่า 5.6 อย่างแน่นอน มิฉะนั้นฉันจะไปกับคำตอบที่ยอมรับ
dkniffin

21
ทางเลือกที่จะทำให้ไฟล์ .cnf mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"ชั่วคราวคือการทำเช่นนี้ในทุบตี: นับตั้งแต่มีการดำเนินการโดยทุบตีโดยตรงจะไม่แสดงขึ้นมาในprintf ps
Dave James Miller

3
ฉันต้องการใช้--defaults-fileมากกว่า--defaults-extra-fileเพราะหลังให้การตั้งค่าใน ~ / .my.cnf
Roger Dueck

185

วิธีการหนึ่งที่สะดวก (แต่ไม่ปลอดภัยเท่ากัน) คือการใช้:

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

โปรดทราบว่าเอกสารอย่างเป็นทางการแนะนำต่อมัน
ดู6.1.2.1 แนวทางสำหรับผู้ใช้ปลายทางสำหรับความปลอดภัยของรหัสผ่าน (คู่มือ Mysql สำหรับรุ่น 5.6) :

การจัดเก็บรหัสผ่านของคุณในMYSQL_PWDตัวแปรสภาพแวดล้อม

วิธีการระบุรหัสผ่าน MySQL ของคุณต้องได้รับการพิจารณาว่าไม่ปลอดภัยอย่างยิ่งและไม่ควรใช้ psบางเวอร์ชันมีตัวเลือกเพื่อแสดงสภาพแวดล้อมของกระบวนการที่กำลังทำงานอยู่ ในบางระบบถ้าคุณตั้งค่าMYSQL_PWDรหัสผ่านของคุณจะสัมผัสกับผู้ใช้อื่น ๆ ที่ทำงานPS แม้แต่ในระบบที่ไม่มีpsเวอร์ชันเช่นนั้นมันก็ไม่ฉลาดที่จะสมมติว่าไม่มีวิธีอื่นที่ผู้ใช้สามารถตรวจสอบสภาพแวดล้อมของกระบวนการได้


6
สิ่งนี้ใช้ไม่ได้กับสคริปต์ทุบตีของฉัน:Access denied for user 'root'@'localhost' (using password: NO)
rubo77

24
export MYSQL_PWD=whateverในสคริปต์คุณจะต้อง
Riot

2
เนื่องจากข้อความค้นหาของฉันรวดเร็วมากฉันจึงเลือกใช้ตัวเลือกนี้ จากนั้นฉันจะตั้งค่าเป็นของปลอมหลังจากรันคิวรี
TimH - Codidact

11
ในสคริปต์ที่คุณไม่จำเป็นต้องวิ่งexportเพียงแค่วางไว้ทั้งหมดในหนึ่งบรรทัด:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
JD

1
@JD: เหมาะสำหรับฉันใน Ubuntu 16.04 กับ MySQL 5.7.21
mivk

70

หากคุณต้องการใช้รหัสผ่านในบรรทัดคำสั่งฉันพบว่าวิธีนี้ใช้ในการกรองข้อความแสดงข้อผิดพลาดเฉพาะ:

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

โดยทั่วไปแล้วจะเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน - และใช้ grep เพื่อวางทุกบรรทัดที่ตรงกับ "คำเตือน: การใช้รหัสผ่าน"

ด้วยวิธีนี้คุณสามารถดูผลลัพธ์อื่น ๆ รวมถึงข้อผิดพลาด ฉันใช้สิ่งนี้สำหรับเชลล์สคริปต์ต่างๆและอื่น ๆ


นี่เป็นโซลูชันที่ยอดเยี่ยมสำหรับใช้ในงานแบบหนึ่งบรรทัดที่เรียกว่าในงานอื่น ๆ เช่นการสร้างงาน Rake สำหรับการปรับใช้ Capistrano
JakeGould

2
ข้อความที่ยอดเยี่ยมและง่ายต่อการปิดเสียงไม่จำเป็นต้องสัมผัสอะไรในการตั้งค่า MySQL
ajaaskel

ฉันจะใช้สิ่งนี้กับ mysqldump ที่ฉันมีการเปลี่ยนเส้นทางสำหรับ SQL ได้อย่างไร
MacroMan

1
นี่เป็นวิธีที่ไม่ดีจริงๆเมื่อเทียบกับที่อื่นที่นี่ มันอาจจะล้มเหลวด้วย MySQL เวอร์ชั่นต่อ ๆ มาหากข้อความเปลี่ยนไปอาจไม่สามารถใช้งานในภาษาอื่น
yktoo

42

นี่คือวิธีที่ฉันได้รับ bash script สำหรับการสำรองฐานข้อมูล mysqldump ทุกวันเพื่อให้ทำงานได้อย่างปลอดภัยยิ่งขึ้น นี่คือการขยายตัวของคำตอบที่ดีของ Cristian Porta

  1. ใช้mysql_config_editorเป็นครั้งแรก(มาพร้อมกับ mysql 5.6+) เพื่อตั้งค่าไฟล์รหัสผ่านที่เข้ารหัส สมมติว่าชื่อผู้ใช้ของคุณคือ "db_user" ทำงานจาก shell prompt:

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

    มันจะถามรหัสผ่าน เมื่อคุณป้อนรหัสผ่านผู้ใช้ / รหัสผ่านจะถูกบันทึกไว้ในของคุณhome/system_username/.mylogin.cnf

    แน่นอนเปลี่ยน "system_username" เป็นชื่อผู้ใช้ของคุณบนเซิร์ฟเวอร์

  2. เปลี่ยน bash script ของคุณจากสิ่งนี้:

    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 เพื่อบันทึกข้อผิดพลาดนั้น
Skamasle

1
ใช้ 2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."เพื่อกำจัดเฉพาะคำเตือนที่เป็นปัญหา
Hafenkranich

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}
"

นี่เป็นการเริ่มเซสชันการคาดหวังซึ่งสามารถใช้ในสคริปต์เพื่อโต้ตอบกับพร้อมต์

ดูโพสต์นี้


นั่นหมายถึง '>' จริงๆหรือไม่?
David Goodwin

ใช่ '>' มีไว้เพื่อให้ mysql_config_editor รับอินพุตจาก stdout สิ่งที่ถูกส่งผ่านจาก stdout ไปยัง mysql_config_editor เป็นรหัสผ่านที่คุณต้องการให้ผู้ใช้นี้มีหากไม่มี '>' สิ่งที่เกิดขึ้นคือคำสั่ง echo แยกวิเคราะห์และสิ่งที่คุณเห็นทุกอย่างหลังจากคำสั่ง echo
phylanx

ดังนั้นคุณหมายถึงใช้ตัวดำเนินการไปป์ "|" ใช่ไหม อย่างน้อยใน * nix และ DOS ">" จะจับ STDOUT และเขียนลงในไฟล์ชื่อ "mysql_config_editor" ในไดเรกทอรีทำงานปัจจุบัน
Jay Dansand

ใช่คุณถูกต้องฉันได้แก้ไขคำตอบเดิมของฉันแล้ว
phylanx

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 ให้ใช้คำสั่ง print:

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

ถ้าฉันต้องการรันคำสั่ง mysqldump ในฐานะผู้ใช้ www-data www-data ไม่มีโฮมไดเร็กตอรี่ ... ฉันจะติดตั้ง mysql_config_editor สำหรับผู้ใช้ www-data ได้อย่างไร?
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

อีกทางเลือกหนึ่งคือการใช้ sshpass เพื่อเรียกใช้ mysql เช่น:

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
ในขณะที่คำตอบนี้ซับซ้อนเล็กน้อยฉันเพิ่ง upvoted เพราะฉันทำให้ฉันเห็นคำตอบที่ไม่ผิดอย่างชัดเจนหรือเป็นผู้ที่ไม่ลงรอยกันเล็กน้อยที่ไม่มีความคิดเห็น! ไม่น่าแปลกใจที่ David ยังไม่ได้ตอบคำถามอื่น ๆ ! เขากระโดดเข้ามาและพยายามช่วยด้วยวิธีแก้ปัญหาแบบใหม่และได้รับการกระแทกโดยไม่มีคำอธิบายว่าทำไม! ผู้ลงนามนิรนาม FU ที่ไม่แสดงความคิดเห็น!
Jeremy Davis

3
+1 เห็นด้วย Jeremy Davis นี่คือ convoluted แต่เมื่อเหลือโดยไม่มีตัวเลือกอื่นอาจยอมรับได้ มันไม่ผิดอย่างแน่นอนซึ่งแตกต่างจากการปิดคำเตือนที่จะต้องเป็นความคิดที่โง่ที่สุดที่เคย!
Ben McIntyre

1
@ JeremyDavis ใช่นี่เป็นเรื่องที่ซับซ้อนเพราะส่วนใหญ่ฉันต้องการแสดงผลงาน มันสามารถทำได้โดยไม่มีวงเล็บ แต่อาจมีความชัดเจนน้อยกว่า นี่เป็นกิจกรรมแรกที่ฉันไม่ได้อ่านในการแลกเปลี่ยนสแต็กทั้งหมด ... หลังจากนั้นฉันไม่ได้สัมผัสเป็นเวลานาน ความคิดเห็นของคุณได้รับการชื่นชมอย่างแน่นอน
เดวิดจี

@DavidG - ดีใจที่ความคิดเห็นของฉันมีค่าสำหรับคุณ ยังเป็นสิ่งที่ยอดเยี่ยมที่ได้เห็นว่าคุณกลับมาแล้วและตอนนี้คำตอบของคุณอยู่ในแดนบวก โดยส่วนตัวแล้วฉันไม่คิดว่าควรอนุญาตให้ลงคะแนนเสียงโดยไม่ต้องแสดงความคิดเห็น ... ทุกคนตั้งใจจะเรียนรู้อย่างไรเมื่อพวกเขาถูกโจมตีเพราะไป?!
Jeremy Davis

ต้องบอกว่าการดูคำตอบของคุณอีกครั้งฉันไม่มั่นใจว่าวิธีแก้ปัญหาแบบถาวร (โดยทั่วไปจะใช้ mysql) กับปัญหาชั่วคราว (การระงับข้อความแสดงข้อผิดพลาดสำหรับการใช้งานในสคริปต์เดียว) เป็นวิธีที่ดีที่สุด IMO การห่อ mysql ในฟังก์ชั่นภายในสคริปต์ (การใช้วิธีการของคุณที่นี่จะดี) เป็นวิธีการที่เหนือกว่า 2c ของฉัน ... :)
Jeremy Davis

3

นี่เป็นวิธีแก้ปัญหาสำหรับนักเทียบท่าในสคริปต์ / bin / sh:

นักเทียบท่า exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[ลูกค้า]"> /root/mysql-credentials.cnf'

นักเทียบท่า exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

นักเทียบท่า exec

นักเทียบท่า exec

แทนที่ [MYSQL_CONTAINER_NAME] และตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อม MYSQL_ROOT_PASSWORD ตั้งอยู่ในที่เก็บของคุณ

หวังว่ามันจะช่วยให้คุณชอบมันจะช่วยฉันได้!


ไม่เลว. ฉันเพิ่งใช้การโทรเพียงครั้งเดียวพร้อมการส่งคืนเช่นdocker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'ใช้การรับสาย--defaults-fileแล้วรูต
Matthew Wilcoxson

3

นอกจากนี้คุณยังสามารถเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐาน STDERR ไปยัง / dev / null

ดังนั้นเพียงทำ:

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


7
ฉันจะหลีกเลี่ยงวิธีนี้เนื่องจากจะทำให้เกิดข้อผิดพลาดทางกฎหมายได้ยากขึ้น
Vladimir Hraban

1

โดยส่วนตัวแล้วฉันใช้สคริปต์ wrapper เพื่อตรวจจับข้อผิดพลาดนั้น นี่คือตัวอย่างโค้ด:

#!/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

สำหรับ PowerShell ( pwshไม่bash) นี้ก็ค่อนข้างเป็นทางออกที่บ้านนอก-โกลด์เบิร์ก ... ความพยายามครั้งแรกของฉันคือการตัดสายไปmysqlในtry/catchฟังก์ชั่น แต่เนื่องจากบางพฤติกรรมแปลกในการจัดการข้อผิดพลาด PowerShellนี้ไม่ได้ทำงาน

วิธีแก้คือแทนที่$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 พร้อมใช้งานสำหรับ Unix ดังนั้นโซลูชันนี้เป็นข้ามแพลตฟอร์ม สามารถปรับให้เข้าbashกับการแก้ไขไวยากรณ์เล็กน้อย

คำเตือน:มีหลายกรณีที่ไม่สามารถใช้งานได้เช่นข้อความแสดงข้อผิดพลาดที่ไม่ใช่ภาษาอังกฤษหรือข้อความที่ส่งคืนคำERRORใดก็ได้ในผลลัพธ์ แต่มันก็เพียงพอที่จะกลืนคำเตือนสำหรับการโทรพื้นฐานmysqlโดยไม่ทิ้งระเบิด สคริปต์ทั้งหมด หวังว่าคนอื่นจะพบว่าสิ่งนี้มีประโยชน์

มันจะดีถ้าmysqlเพียงเพิ่มตัวเลือกในการระงับคำเตือนนี้


1

หากคุณใช้ Rundeck สำหรับกำหนดเวลางานของคุณหรือแพลตฟอร์มอื่น ๆ ที่คุณขอ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;"

จากนั้น unia, aliaas:
Neil Davis

FYI คุณไม่สามารถใช้นามแฝงหากคุณกำลังเรียก mysql ภายในฟังก์ชั่นภายในสคริปต์
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''ตัวเลือกที่อยู่ที่นี่เข้ากันได้กับระบบปฏิบัติการ Mac OS X ได้มาตรฐาน UNIX ระบบปฏิบัติการที่สามารถใช้ตรง-i


1
รหัสผ่านยังคงอยู่ในบรรทัดคำสั่งของ 'sed' ดังนั้นจึงยังคงมองเห็นได้ในรายการกระบวนการแม้เพียงชั่วครู่
แอนโธนี

-1

ปัญหาที่ฉันมีคือการใช้ผลลัพธ์ในเงื่อนไขในสคริปต์ทุบตี

นี่ไม่ใช่ความหรูหรา แต่ในนักเทียบท่า env สิ่งนี้ไม่สำคัญ โดยพื้นฐานแล้วสิ่งนี้จะไม่สนใจผลลัพธ์ที่ไม่ได้อยู่ในบรรทัดสุดท้าย คุณสามารถทำคล้ายกับ awk และเปลี่ยนเพื่อกลับทั้งหมดยกเว้นบรรทัดแรกเป็นต้น

นี่จะส่งคืนบรรทัดสุดท้ายเท่านั้น

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

จะไม่ระงับข้อผิดพลาด แต่จะทำให้แน่ใจว่าคุณสามารถใช้ผลลัพธ์ของแบบสอบถามในสคริปต์ทุบตี


-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
เพิ่งทราบว่ามันจะระงับข้อความผิดพลาดทั้งหมดไม่เพียงคำเตือนรหัสผ่านเหล่านั้น
Simon East

-3

มันใช้งานได้สำหรับฉัน - เพิ่งเพิ่ม2> nullหลังจาก$(mysql_command)นั้นและจะระงับข้อผิดพลาดและข้อความเตือนเท่านั้น


1
นั่นหมายความว่าคุณจะไม่ได้รับรายงานเมื่อมีสิ่งผิดพลาดเกิดขึ้น!
แอนโธนี

2>/dev/nullนอกจากนี้คุณอาจต้องการ การใช้2> nullจะใส่ผลลัพธ์ลงในไฟล์ชื่อ "null" ในไดเรกทอรีปัจจุบัน
thelogix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.