mysqladmin không lấy mật khẩu nội tuyến


10

Tôi đang cố gắng thiết lập một công việc định kỳ để lấy bản sao lưu từ máy nô lệ của mình. Vì vậy, tôi cần phải ngăn chặn nô lệ

Tôi đã ra lệnh

mysqladmin --user=root --password=test_pass stop-slave

Nhưng đó là lỗi ném:

mysqladmin: kết nối với máy chủ tại 'localhost' không thành công: 'Truy cập bị từ chối cho người dùng' root '@' localhost '(sử dụng mật khẩu: CÓ)'

Bây giờ tôi đã thử với lệnh

mysqladmin --user=root --password stop-slave

Nó nhắc mật khẩu và tôi đã cho test_passvà mọi thứ đều ổn.

Tại sao lại xảy ra như vậy? Sự thay thế là gì?

NB: BTW phiên bản mysql của tôi là mysql-5.0.95-5, nó có ý nghĩa gì.


Mật khẩu của bạn có bất kỳ ký tự đặc biệt nào mà trình bao có thể diễn giải không? Bạn đã thử đặt mật khẩu trong 'ngoặc kép' hoặc "dấu ngoặc kép" chưa?
Michael - sqlbot

các ký tự đặc biệt mà shell có thể có được thông dịch là gì? Có tài liệu nào không?
Praveen Prasannan

1
Các nhân vật như $ &! \ [] <> tất cả đều xuất hiện trong tâm trí có khả năng có vấn đề. Việc đóng mật khẩu trong 'dấu ngoặc đơn sẽ ngăn chặn vấn đề đó. gnu.org/software/bash/manual/bashref.html#Quote
Michael - sqlbot

2
tuyệt vời .. làm việc. Tôi muốn đánh dấu đây là câu trả lời. Bạn có thể vui lòng đặt nó làm câu trả lời không
Praveen Prasannan

@ Michael-sqlbot có bạn nên đăng là câu trả lời
RolandoMySQLDBA

Câu trả lời:


21

Đối số dòng lệnh có thể được giải thích bởi vỏ lệnh của hệ thống, thay đổi hành vi của lệnh hoặc thay đổi giá trị của các đối số trước khi chúng được chuyển vào chương trình được gọi.

Khi một đối số (chẳng hạn như giá trị cho --password) chứa một ký tự mà shell có thể diễn giải, chúng cần được trích dẫn (thường được đặt trong các trích dẫn đơn 'trong dấu ngoặc kép hoặc dấu ngoặc kép "trong Windows) hoặc thoát riêng lẻ (thường có dấu gạch chéo ngược \trước mỗi metacharacter ) để tránh giải thích bằng vỏ.

Mặc dù các ký tự cụ thể là dành riêng cho hệ thống, một số ký tự cần chú ý bao gồm:

$ & ! \ [ ] < > `

Nếu mật khẩu, ví dụ thực sự xấu, được đặt thành pa$$word...

mysql --password=pa$$word     # does not work
mysql --password='pa$$word'   # works
mysql --password=pa\$\$word   # works, but slightly unclear what's going on at first glance

Đọc thêm:


Cập nhật: để thoát dấu ngoặc 'đơn hoặc "dấu ngoặc kép trong mật khẩu, bạn có thể thoát chúng bằng dấu gạch chéo ngược hàng đầu hoặc gửi toàn bộ đối số theo kiểu trích dẫn ngược lại nếu không có ký tự nào khác mà kiểu trích dẫn được chọn không tương thích với.

mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle

Nếu bạn cũng có một trích dẫn và các ký tự đặc biệt khác, bạn sẽ bị mắc kẹt với dấu gạch chéo ngược vì trong unix, trích dẫn kép "yếu" hơn một trích dẫn và nhiều ký tự đại diện vẫn được mở rộng khi được đặt trong dấu ngoặc kép nhưng không đơn lẻ trích dẫn.

Đây không phải là đặc thù của MySQL nhưng áp dụng cho mọi thứ có đối số dòng lệnh.

Thông thường bạn có thể sử dụng echolệnh để xem shell đang diễn giải các đối số của bạn như thế nào.

$ echo foo$bar 
foo                # literal 'foo' plus the (empty) shell variable $bar

$ echo foo\$bar
foo$bar            # backslash prevents expansion of $bar as a variable

$ echo "foo$$bar"  # weaker double quote doesn't prevent expansion so
foo9691bar         # the $$ expands to the unix process id (pid) of the current shell

$ echo 'foo$$bar'
foo$$bar           # "stronger" single quote prevents shell expansion

$ echo "foo'bar"
foo'bar            # double quote allows single quote within the literal

Theo dõi: Shell bash (và có lẽ là một số người khác) cho phép thoát các dấu ngoặc đơn trong các chuỗi trích dẫn đơn, mặc dù quy ước này rất kỳ quái (có thể dựa trên một số quyết định đã bị lãng quên từ lâu đối với thời gian)

Thay thế từng 'bên trong chuỗi bằng '\''trước khi gói toàn bộ chuỗi trong dấu ngoặc đơn ... vì vậy chuỗi ký tự foo'barđược thể hiện dưới dạng 'foo'\''bar'.

Như tôi đã nói, kỳ quái. Điều này là cần thiết bởi vì dấu gạch chéo ngược thoát khỏi một trích dẫn bên ngoài một chuỗi được trích dẫn, dấu gạch chéo ngược không thoát khỏi bên trong một chuỗi trích dẫn trong bash và các chuỗi trích dẫn đơn có thể được đóng và mở lại bằng nhiều dấu ngoặc đơn miễn là không có dấu ngoặc kép nhân vật can thiệp có ý nghĩa đặc biệt. Vì vậy, '\''đóng trích dẫn của chuỗi, sau đó cung cấp các chữ đã thoát, sau đó mở lại trích dẫn của chuỗi.


1
Cần làm rõ hơn một chút. Điều gì xảy ra nếu dấu ngoặc đơn (') đến trong trường mật khẩu? Thoát khỏi nó bằng dấu gạch chéo () là cách duy nhất?
Praveen Prasannan

Thật là một sự cố mà mật khẩu máy chủ trực tiếp của tôi được đặt thànhpa$$word
Umair

0

Thêm vào:

Trên Windows Machine, chúng tôi cũng phải vật lộn với một mật khẩu: nó chứa %trong đó cần phải thoát như %%(Chỉ trích dẫn là không đủ ở đây)

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.