mysqladmin ไม่ใช้รหัสผ่านแบบอินไลน์


10

ฉันกำลังพยายามตั้งค่า cron สำหรับการสำรองข้อมูลจากเครื่องส ดังนั้นฉันต้องหยุดทาส

ฉันออกคำสั่ง

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

แต่มันกำลังโยนข้อผิดพลาด:

mysqladmin: เชื่อมต่อกับเซิร์ฟเวอร์ที่ 'localhost' ล้มเหลวผิดพลาด: 'การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้' รูท '@' localhost '(ใช้รหัสผ่าน: YES)'

ตอนนี้ฉันลองด้วยคำสั่ง

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

มันให้รหัสผ่านและฉันก็ให้test_passและทุกอย่างก็ดี

ทำไมจึงเกิดขึ้น ทางเลือกคืออะไร?

NB: BTW รุ่น mysql ของฉันคือmysql-5.0.95-5มันทำให้รู้สึกใด ๆ


รหัสผ่านของคุณมีอักขระพิเศษใด ๆ ที่เชลล์อาจตีความหรือไม่ คุณได้ลองใส่รหัสผ่านใน 'อัญประกาศ' หรือ 'คำพูด'?
Michael - sqlbot

อักขระพิเศษใดที่เชลล์อาจได้รับการตีความ? มีเอกสารอะไรบ้าง?
Praveen Prasannan

1
ตัวละครเช่น $ &! \ [] <> ทุกคนคิดว่าอาจเป็นปัญหา การใส่รหัสผ่านใน'เครื่องหมายคำพูดเดียวควรป้องกันปัญหานั้น gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot

2
ดีมาก .. ฉันต้องการทำเครื่องหมายคำตอบนี้เป็นคำตอบ กรุณาช่วยตอบด้วยหน่อยได้ไหม
Praveen Prasannan

@ Michael-sqlbot ใช่คุณควรโพสต์เป็นคำตอบ
RolandoMySQLDBA

คำตอบ:


21

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

เมื่ออาร์กิวเมนต์ (เช่นค่าสำหรับ--password) มีอักขระที่เชลล์อาจตีความพวกเขาจะต้องยกมา (มักจะอยู่ในเครื่องหมายคำพูดเดียว'ในยูนิกซ์หรืออัญประกาศคู่"ใน Windows) หรือหนีเป็นรายบุคคล (มักจะมีเครื่องหมายทับขวา\ก่อนแต่ละ metacharacter ) เพื่อหลีกเลี่ยงการตีความโดยเชลล์

ในขณะที่อักขระเฉพาะเป็นระบบเฉพาะอักขระบางตัวที่ต้องระวัง ได้แก่ :

$ & ! \ [ ] < > `

หากรหัสผ่านสำหรับตัวอย่างที่ไม่ดีจริง ๆ ถูกตั้งเป็น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

อ่านเพิ่มเติม:


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

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

หากคุณมีเครื่องหมายคำพูดเดี่ยวและอักขระพิเศษอื่น ๆ เช่นกันคุณกำลังติดกับเครื่องหมายแบ็กสแลชหนีเนื่องจากในยูนิกซ์เครื่องหมายคำพูดคู่คือ "อ่อนแอ" กว่าเครื่องหมายคำพูดเดี่ยวและอักขระเมตาหลายตัวยังคงขยายเมื่ออยู่ในเครื่องหมายคำพูดคู่ คำพูด

นี่ไม่ใช่ MySQL เฉพาะ แต่ใช้กับทุกอย่างที่มีอาร์กิวเมนต์บรรทัดคำสั่ง

โดยทั่วไปคุณสามารถใช้echoคำสั่งเพื่อดูว่าเชลล์ตีความตีความอาร์กิวเมนต์ของคุณอย่างไร

$ 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

การติดตามผล: เชลล์ทุบตี (และบางคนอาจสันนิษฐานได้) อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยวภายในสตริงที่ยกมาเดี่ยวแม้ว่าการประชุมจะแปลกประหลาด (อาจขึ้นอยู่กับการตัดสินใจที่ลืมไปนานบางส่วนที่หายไปจากหมอกแห่งกาลเวลา)

แทนที่แต่ละ'ภายในสตริงที่มี'\''ก่อนที่จะตัดสตริงทั้งหมดในราคาเดียว ... ดังนั้นสายอักขระตัวอักษรจะแสดงเป็นfoo'bar'foo'\''bar'

อย่างที่ฉันพูดไป สิ่งนี้เป็นสิ่งจำเป็นเนื่องจากแบ็กสแลชหนีเครื่องหมายอัญประกาศเดี่ยวด้านนอกของสตริงที่ยกมาเดี่ยวเครื่องหมายแบ็กสแลชไม่มีอะไรในสตริงที่ยกมาเดี่ยวในทุบตีและสตริงที่ยกมาเดี่ยวสามารถปิดและเปิดใหม่โดยคำพูดเดียวหลายตราบใดที่ไม่มี การแทรกตัวอักขระที่มีความหมายพิเศษ ดังนั้น'\''ปิดข้อความของสตริงแล้วส่งตัวอักษรที่หนีแล้วเปิดข้อความของสตริงอีกครั้ง


1
ต้องการคำชี้แจงเพิ่มเติมเล็กน้อย เกิดอะไรขึ้นถ้าคำพูดเดียว (') มาในช่องรหัสผ่าน? หนีด้วย slash () เป็นวิธีเดียวหรือไม่
Praveen Prasannan

เกิดอะไรขึ้นเมื่อรหัสผ่านของเซิร์ฟเวอร์จริงของฉันถูกตั้งค่าเป็นpa$$word
Umair

0

ส่วนที่เพิ่มเข้าไป:

บนเครื่อง Windows เราต้องต่อสู้กับรหัสผ่านเช่นกัน: มันบรรจุอยู่%ซึ่งจำเป็นต้องหลบหนีด้วย%%(ราคาเพียงอย่างเดียวไม่เพียงพอที่นี่)

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