Làm thế nào để truyền mật khẩu vào dòng lệnh mysql


20

Tôi có mật khẩu MySQL được lưu trên một tệp foo.php, ví dụ như P455w0rdkhi tôi cố gắng sử dụng nó:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Cả hai tùy chọn vẫn yêu cầu mật khẩu, cách chính xác để gửi mật khẩu là stdingì?


3
không được để trống giữa -pvà mật khẩu của bạn.
Fırat KÜÇÜK

mysql không đọc mật khẩu từ stdin, tôi không thể tìm ra mật khẩu của nó.
Omn

Câu trả lời thích hợp là không đặt mật khẩu của bạn vào dòng lệnh nơi bất kỳ ai có quyền truy cập /procđều có thể đọc chúng một cách tầm thường miễn là chương trình đang chạy . Đó là những gì ~/.my.cnfdành cho, được chọn đúng vào 0600
Shadur

Câu trả lời:


25

Bạn phải rất cẩn thận về cách bạn chuyển mật khẩu cho các dòng lệnh vì nếu không cẩn thận, cuối cùng bạn sẽ để nó mở để đánh hơi bằng các công cụ như ps.


Cách an toàn nhất để làm điều này là tạo một tệp cấu hình mới và chuyển nó sang mysqlsử dụng tùy chọn --defaults-file=hoặc --defaults-extra-file=dòng lệnh.

Sự khác biệt giữa hai là cái sau được đọc cùng với các tệp cấu hình mặc định trong khi với tệp trước, chỉ có một tệp được truyền làm đối số được sử dụng.

Tệp cấu hình bổ sung của bạn phải chứa nội dung tương tự:

[client]
user=foo
password=P@55w0rd

Hãy chắc chắn rằng bạn bảo mật tập tin này.

Sau đó chạy:

mysql --defaults-extra-file=<path to the new config file> [all my other options]

2
MySQL sẽ sửa đổi nó argvđể ghi đè lên các tham số được cung cấp cho -pcờ. Ít nhất đó là những gì đã kết luận ở đây, cùng với thông tin liên quan khác: unix.stackexchange.com/questions/78757/ mẹo
Kusalananda

Đây là giải pháp tốt nhất, vì nó cung cấp một biện pháp bảo mật. Bạn cần phải chmod go-rwx và đảm bảo đối số này ưu tiên tất cả các đối số khác.
ChuckCottrill

1
@Kusalananda, vâng, nhưng theo nhận xét về unix.stackexchange.com/q/385339/135943 , điều đó không có nghĩa là nó an toàn!
tự đại diện

Có thể đáng để thêm một ghi chú về --login-pathbây giờ nó được hỗ trợ. Nó không tốt hơn nhiều so với điều này, nhưng nó là văn bản đơn giản hơn một chút (mặc dù rào cản chuyển đổi nội dung thành văn bản thấp).
Geoffrey Wiseman

6
Đặt MYSQL_PWD trong môi trường ( export MYSQL_PWD=muhpassword) và thực hiện lệnh của bạn mà không cần -p. Xem Biến môi trường chương trình MySQL . Mặc dù cảnh báo nghiêm trọng của hướng dẫn sử dụng , điều này là khá an toàn . Trừ khi bạn bắt đầu warez lạ trong cùng một vỏ sau này. Vì vậy, chúng tôi chạy:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer

12

Các mysqltiện ích khách hàng có thể tham gia một mật khẩu trên dòng lệnh với một trong hai -phoặc --password=tùy chọn.

Nếu bạn sử dụng -p, không được có bất kỳ khoảng trống nào sau chữ tùy chọn:

$ mysql -pmypassword

Tôi thích các tùy chọn dài trong các tập lệnh vì chúng là tài liệu tự:

mysql --password=mypassword --user=me --host=etc

3
Điều này không an toàn vì bất kỳ người dùng nào cũng có thể xem mật khẩu - trực tiếp thông qua /proc/$pid/cmdlinehoặc thông qua pslệnh. Đúng là mysql ghi đè mật khẩu trong argv khi khởi động nhưng luôn có một cửa sổ thời gian nơi người dùng khác có thể quan sát mật khẩu. Ngoài ra, trên một số hệ thống, ghi đè argv có thể không hoạt động.
maxschlepzig

3

Nếu bạn muốn bắt đầu mysqlvới một mật khẩu được cung cấp, trước tiên bạn phải tìm nạp mật khẩu trong một biến:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Sau đó, bạn có thể bắt đầu mysqllệnh của bạn với:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver

1
Điều này cũng gây nguy hiểm cho bảo mật mật khẩu của bạn . Lưu ý rằng có MYSQL_PWDbiến môi trường được đọc bởi mysqlnếu bạn không chỉ định -p. Và trong Linux, đây là một phương pháp an toàn vì môi trường của người dùng không thể được đọc bởi những người dùng không được cung cấp khác - trái ngược với vectơ đối số.
maxschlepzig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.