จะทำการ mysqldump โดยไม่ต้องใส่รหัสผ่านได้อย่างไร?


229

ฉันต้องการทราบคำสั่งเพื่อทำการ mysqldump ของฐานข้อมูลโดยไม่ต้องแจ้งรหัสผ่าน

เหตุผล: ฉันต้องการทำงาน cron ซึ่งใช้ mysqldump ของฐานข้อมูลวันละครั้ง ดังนั้นฉันจะไม่สามารถใส่รหัสผ่านเมื่อได้รับแจ้ง

ฉันจะแก้ปัญหานี้อย่างไร

คำตอบ:


412

เมื่อคุณใช้งาน Ubuntu สิ่งที่คุณต้องทำคือเพียงเพิ่มไฟล์ในโฮมไดเร็กตอรี่ของคุณและมันจะปิดการใช้งานการแจ้งเตือนรหัสผ่าน mysqldump สิ่งนี้ทำได้โดยการสร้างไฟล์~/.my.cnf(สิทธิ์ต้องมี 600)

เพิ่มสิ่งนี้ลงในไฟล์. my.cnf

[mysqldump]
user=mysqluser
password=secret

สิ่งนี้ช่วยให้คุณเชื่อมต่อในฐานะผู้ใช้ MySQL ที่ต้องการรหัสผ่านโดยไม่ต้องป้อนรหัสผ่านจริง คุณไม่จำเป็นต้องใช้ -p หรือ - รหัสผ่าน

มีประโยชน์มากสำหรับการเขียนสคริปต์คำสั่ง mysql & mysqldump

ขั้นตอนในการบรรลุเป้าหมายสามารถพบได้ในลิงค์นี้

หรือคุณสามารถใช้คำสั่งต่อไปนี้:

mysqldump -u [user name] -p[password] [database name] > [dump file]

แต่โปรดทราบว่ามันไม่ปลอดภัยโดยเนื้อแท้เนื่องจากผู้ใช้รายอื่นบนระบบสามารถดูคำสั่งทั้งหมด (รวมถึงรหัสผ่าน) ในขณะที่ดัมพ์รันอยู่โดยใช้ps axคำสั่งง่าย ๆ


55
downvote คำตอบอื่น ๆ ผ่าน -p บนบรรทัดคำสั่งเนื่องจากผู้ใช้สามารถ ps aux เพื่อดูรหัสผ่านรูทหรือผู้ใช้ การใช้คำแนะนำไฟล์ด้านบนมีความปลอดภัยมากที่สุด
เอ็ดดี้

19
หากมีการตั้งค่าส่วนกลางไม่ได้ตัวเลือก (ในกรณีที่คุณไม่ได้เพียงหนึ่งตัวอย่าง MySQL เพื่อเชื่อมต่อ) คุณสามารถตั้งค่าไฟล์ config --defaults-fileผ่าน เช่น `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis

3
@kante: มันปลอดภัย ผู้ใช้ที่เป็นเจ้าของไฟล์. mycnf เท่านั้น
Yann Sagon

7
บน Windows, ~/.my.cnfการตั้งค่าไฟล์ไม่ได้อยู่ที่ ดูstackoverflow.com/a/14653239/470749 MySql c:\wamp\bin\mysql\mysql5.5.24\my.cnfคาดว่าเหมืองจะเป็นที่ ดังนั้นฉันจึงสร้างไฟล์ที่นั่น การรีสตาร์ท Mysql ไม่จำเป็น มันทำงานได้ทันทีสำหรับ mysqldump ต่อไปของฉัน
Ryan

6
เพื่อเพิ่มระดับความปลอดภัยคุณควรใช้เฉพาะผู้ใช้ที่ไม่ใช่ฐานข้อมูลเฉพาะผู้ใช้แบบอ่านอย่างเดียวและไม่ว่าในกรณีใดผู้ใช้รูท สามารถทำได้เช่นนี้:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

การเพิ่มคำตอบของ @ Frankline:

-pตัวเลือกที่จะต้องได้รับการยกเว้นจากคำสั่งในการใช้รหัสผ่านในไฟล์ config

แก้ไข:
mysqldump –u my_username my_db > my_db.sql

ไม่ถูกต้อง:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf สามารถละเว้นชื่อผู้ใช้

[mysqldump]
password=my_password

หาก.my.cnfไฟล์ไม่ได้อยู่ในสถานที่เริ่มต้นและไม่เห็นมันระบุว่าใช้mysqldump--defaults-file

mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql


Damnit, บทเรียน XAMPP จำนวนมากรวมถึง -p โดยไม่ต้องอธิบาย มันไม่ทำงานสำหรับการเลี่ยงรหัสผ่านเปล่า ...
เนลสัน

47

คำตอบเล็ก ๆ น้อย ๆ พูดถึงการใส่รหัสผ่านในไฟล์กำหนดค่า

export MYSQL_PWD=yourverysecretpasswordหรือจากสคริปต์ของคุณที่คุณสามารถ

ข้อดีของวิธีนี้มากกว่าการใช้ไฟล์กำหนดค่าคือคุณไม่จำเป็นต้องใช้ไฟล์กำหนดค่าแยกต่างหากเพื่อซิงค์กับสคริปต์ของคุณ คุณมีสคริปต์ที่จะรักษาเท่านั้น

มีข้อเสียไม่ให้วิธีนี้

รหัสผ่านจะไม่ปรากฏแก่ผู้ใช้รายอื่นในระบบ (จะปรากฏให้เห็นหากอยู่ในบรรทัดคำสั่ง) ตัวแปรสภาพแวดล้อมจะปรากฏต่อผู้ใช้ที่ใช้คำสั่ง mysql และรูทเท่านั้น

รหัสผ่านจะปรากฏแก่ทุกคนที่สามารถอ่านสคริปต์ได้ด้วยตนเองดังนั้นโปรดตรวจสอบให้แน่ใจว่าสคริปต์นั้นได้รับการป้องกัน สิ่งนี้ไม่แตกต่างไปจากการปกป้องไฟล์กำหนดค่า คุณยังสามารถระบุรหัสผ่านจากไฟล์แยกต่างหากหากคุณต้องการให้สคริปต์อ่านได้แบบสาธารณะ ( export MYSQL_PWD=$(cat /root/mysql_password)ตัวอย่าง) การส่งออกตัวแปรยังง่ายกว่าการสร้างไฟล์กำหนดค่า

เช่น,

$ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

แม้ว่าคำตอบนี้จะไม่ "ไม่ถูกต้อง" แต่ก็ยังไม่ปลอดภัย แต่ตัวแปรสภาพแวดล้อมที่ส่งออกจะยังคงมองเห็นได้ง่ายเมื่อโปรแกรมกำลังทำงาน ...
MatheusOl

4
@MatheusOl: ตัวแปรสภาพแวดล้อมสามารถมองเห็นได้เฉพาะกับ root และผู้ใช้เอง - ผู้ใช้รายเดียวกันซึ่งสามารถเข้าถึงไฟล์กำหนดค่าที่ถือรหัสผ่านอยู่แล้ว
chutz

1
@mniess คุณผิด export MYSQL_PWD=...ไม่ไม่แสดงขึ้นในรายการกระบวนการ ไม่แม้แต่เสี้ยววินาที นี่เป็นเพราะexportคำสั่งคือ (และต้องมี) เชลล์บิวด์อิน ดังนั้นเชลล์จะไม่แยก / exec กระบวนการด้วยอาร์กิวเมนต์ของคำสั่งหากคุณดำเนินการในเชลล์
maxschlepzig

1
@maxschlepzig คุณถูกต้อง ในกรณีนี้มันไม่สำคัญเพราะการใส่รหัสผ่านใน ENV ทำให้ผู้ใช้คนอื่นมองเห็นได้ (ตามที่ได้รับคำเตือนในเอกสารประกอบ mysql)
309

2
@mniess อย่างที่ฉันบอกไว้ว่าเอกสารของ mysql นั้นแย่มากและทำให้เข้าใจผิด 'ต้องถือว่าไม่ปลอดภัยอย่างยิ่งและไม่ควรใช้' เป็นคำแนะนำที่ผิดและไม่ดีเมื่อใช้ Linux และระบบอื่น ๆ และสิ่งนี้ไม่สนับสนุนการอ้างสิทธิ์ของคุณซึ่งเป็น: 'เนื่องจากการใส่รหัสผ่านใน ENV ทำให้ผู้ใช้รายอื่นมองเห็นได้' หมายเหตุด้านข้าง: ขำ ๆ แต่คำว่า Oracle ไม่ได้คัดค้านการส่งรหัสผ่านในบรรทัดคำสั่งซึ่งอันที่จริงแล้วมันไม่ปลอดภัยอย่างยิ่ง
maxschlepzig

42

ในการใช้ไฟล์ที่อยู่ภายใน OS ให้ใช้--defaults-extra-fileเช่น:

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql

หมายเหตุ: .sqlpwdเป็นเพียงชื่อไฟล์ตัวอย่าง คุณสามารถใช้สิ่งที่คุณต้องการ

หมายเหตุ: MySQL จะตรวจสอบอัตโนมัติ~/.my.cnfซึ่งสามารถใช้แทน--defaults-extra-file

หากคุณใช้ CRON อย่างฉันลองนี่สิ!

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"

สิทธิ์ที่จำเป็นและกรรมสิทธิ์ที่แนะนำ

sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd

.sqlpwd เนื้อหา:

[mysqldump]
user=username
password=password

ตัวอย่างอื่น ๆ ที่จะผ่านเข้า.cnfหรือ.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

หากคุณต้องการเข้าสู่ระบบฐานข้อมูลโดยอัตโนมัติคุณจะต้องมี[mysql]รายการดังกล่าว

ตอนนี้คุณสามารถสร้างชื่อแทนอัตโนมัติที่เชื่อมโยงคุณกับฐานข้อมูล

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"

คุณสามารถใส่รหัสผ่านเท่านั้น.sqlpwdและส่งชื่อผู้ใช้ผ่านสคริปต์ / cli ฉันไม่แน่ใจว่าสิ่งนี้จะปรับปรุงความปลอดภัยหรือไม่นั้นจะเป็นคำถามที่แตกต่างกันทั้งหมด

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

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql

หมายเหตุ: ไม่มีช่องว่างระหว่าง -p และรหัสผ่าน

เช่น-pPassWordถูกต้องในขณะที่-p Passwordไม่ถูกต้อง


2
นี่คือคำตอบที่ดีที่สุดโดยเฉพาะอย่างยิ่งเมื่อพิจารณาหลายฐานข้อมูลและผู้ใช้ / รหัสผ่าน
Hazok

BTW, ตัวเลือกแบบยาว (เช่น --defaults-file) ควรวางไว้ก่อนตัวเลือกสั้น ๆ (เช่น -u) ทดสอบกับ mysqldump เวอร์ชั่น 5.7.17
ดูแลระบบ

@Sysadmin อาร์กิวเมนต์ตัวเลือกเริ่มต้นด้วยขีดกลางหนึ่งหรือสองขีดกลางขึ้นอยู่กับว่ามันเป็นรูปแบบสั้นหรือรูปแบบยาวของชื่อตัวเลือก ตัวเลือกมากมายมีทั้งแบบสั้นและแบบยาว ตัวอย่างเช่น, -? และ - ช่วยเป็นรูปแบบสั้นและระยะยาวของตัวเลือกที่สั่งให้โปรแกรม MySQL แสดงข้อความช่วยเหลือ dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

ใช่มันง่ายมาก .... เพียงแค่ในบรรทัดคำสั่งที่มีมนต์ขลังหนึ่งไม่มีอีกต่อไป

mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql

และทำ :)


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

6
@Yatatron มันอาจไม่ปลอดภัยโดยเฉพาะอย่างยิ่งในวันที่ระบบ Unix โบราณมีคน 10-15 คนเข้าสู่ระบบได้เกือบทุกวันและ vi ติดขัด ใน VPS ที่ทันสมัยในขณะที่คุณสามารถมีเปลือกหอย 10-15 คนในและใช้ IRC มันเป็นเรื่องธรรมดาสำหรับผู้ดูแลระบบเท่านั้นที่มีสิทธิ์เข้าถึงเชลล์
Christos Hayward

3
ขอบคุณสำหรับสิ่งนี้ฉันแค่ใช้มันในกล่องเชื่อมต่อนักพัฒนาซอฟต์แวร์ ดังนั้นการรักษาความปลอดภัยไม่ใช่ปัญหา
MikeiLL

7

สำหรับผมใช้ MariaDB ผมต้องทำเช่นนี้: เพิ่มไฟล์และสิทธิ์การเปลี่ยนแปลงโดยการทำ~/.my.cnf chmod 600 ~/.my.cnfจากนั้นเพิ่มข้อมูลรับรองของคุณลงในไฟล์ ชิ้นมายากลที่ฉันขาดหายไปคือรหัสผ่านจะต้องอยู่ภายใต้บล็อกไคลเอนต์ (อ้างอิง: เอกสาร ) เช่น:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

หากคุณเกิดขึ้นที่นี่มาหาวิธีทำ mysqldump กับ MariaDB วางรหัสผ่านไว้ในบล็อก [ไคลเอนต์] จากนั้นผู้ใช้ภายใต้บล็อก [mysqldump]


ฉันใช้ MariaDB ด้วย (10.4 เป็นเจาะจง) และฉันก็ใส่รหัสผ่านใน[mysqldump]ส่วนและมันก็ทำงานได้โดยไม่มีปัญหาใด ๆ Ubuntu 18.04 LTS
Paul Davis

3

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

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

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

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

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

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

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


0

ฉันมีดังต่อไปนี้

/ etc / mysqlpwd

[mysql]
user=root
password=password

ด้วยนามแฝงดังต่อไปนี้

alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'

ในการทำการกู้คืนฉันใช้:

mysql -p [database] [file.sql]

-2

สิ่งที่เกี่ยวกับ --password = "" ทำงานสำหรับฉันที่ทำงานบน 5.1.51

mysqldump -h localhost -u <user> --password="<password>"

รวมถึง--password=xxxในบรรทัดคำสั่งจะทำให้ทุกคนที่มองเห็น
Rafa

-11

แน่นอนฉันคิดว่ามันจะดีกว่าและปลอดภัยกว่าที่จะวางบรรทัด cmd แบบเต็มในรูต crontab ด้วย credentails อย่างน้อยการแก้ไข crontab จะถูก จำกัด (อ่านได้) สำหรับคนที่รู้รหัสผ่านแล้วดังนั้นไม่ต้องกังวลที่จะแสดงเป็นข้อความธรรมดา ...

หากต้องการมากกว่า mysqldump ง่าย ๆ เพียงแค่วางสคริปต์ทุบตีที่ยอมรับ credentails เป็นพารามิเตอร์และดำเนินการสิ่งอำนวยความสะดวกทั้งหมดภายใน ...

ไฟล์ bas ในแบบง่าย ๆ

#!/bin/bash
mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql

ใน Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log

3
ไม่มันจะไม่ปลอดภัยกว่าเมื่อคุณเพิ่มรหัสผ่านใน commandline ทุกคนที่มีความสามารถในการอ่าน proc (หรือทำ ps เต็ม) จะมองเห็นได้ซึ่งเป็นค่าเริ่มต้นที่ค่อนข้างดี เมื่อคุณเพิ่มไฟล์. my.cnf และตั้ง 600 สิทธิ์คุณจะเห็นได้เฉพาะคุณเท่านั้น
rombarcz

-21

คุณสามารถระบุรหัสผ่านในบรรทัดคำสั่งดังต่อไปนี้:

mysqldump -h <host> -u <user> -p<password> dumpfile

ตัวเลือกสำหรับ mysqldump คือ Case Sensitive!


Nope มันไม่ได้ทำงานผมไม่คิดว่ามันเข้าใจว่า -p คือรหัสผ่าน
Prakash รามัน

1
ไม่แน่ใจว่าสิ่งนี้มี 1 เสียงฉันลงคะแนนนี้ ดังที่เห็นในคำตอบอื่น ๆ ที่นี่ไม่ควรมีช่องว่างระหว่าง -p และรหัสผ่านที่กำหนด นอกจากนี้คุณควรเปลี่ยนเส้นทางเอาต์พุตไปยัง dumpfile ไม่ได้ระบุในขณะที่คุณกำลังทำหรือมันจะถือว่าเป็นชื่อตาราง @buzypi พูดได้ดีที่สุด
Neek

มันควรจะทำงานได้ (แม้ว่าจะไม่ปลอดภัยเพราะมันง่ายสำหรับผู้ใช้คนอื่น ๆ ที่จะเห็นรหัสผ่าน) คุณเพียงแค่ต้องแน่ใจว่าไม่มีช่องว่างระหว่าง -p และรหัสผ่านเช่นmysqldump -u root -pmypassword
jx12345
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.