mysqladmin tidak mengambil kata sandi sebaris

10

Saya mencoba mengatur pekerjaan cron untuk mengambil cadangan dari mesin slave saya. Jadi saya harus menghentikan budaknya

Saya mengeluarkan perintah

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

Tapi itu melempar kesalahan:

mysqladmin: terhubung ke server di 'localhost' gagal kesalahan: 'Akses ditolak untuk pengguna' root '@' localhost '(menggunakan kata sandi: YES)'

Sekarang saya mencoba dengan perintah itu

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

Itu meminta kata sandi dan saya berikan sebagai test_passdan semuanya baik-baik saja.

Kenapa begitu terjadi? Apa alternatifnya?

NB: BTW versi mysql saya mysql-5.0.95-5, itu masuk akal.

Praveen Prasannan
sumber
Apakah kata sandi Anda memiliki karakter khusus yang mungkin ditafsirkan oleh shell? Sudahkah Anda mencoba memasukkan kata sandi dalam 'tanda kutip' atau "tanda kutip"?
Michael - sqlbot
yang merupakan karakter khusus yang mungkin ditafsirkan shell? apakah ada dokumentasi?
Praveen Prasannan
1
Karakter seperti $ &! \ [] <> semua terlintas dalam pikiran sebagai berpotensi bermasalah. Menutup kata sandi dalam 'tanda kutip tunggal harus mencegah masalah itu. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot
2
bagus .. bekerja. Saya ingin menandai ini sebagai jawaban. Dapatkah Anda menjelaskannya sebagai jawaban
Praveen Prasannan
@ Michael-sqlbot ya Anda harus memposting sebagai jawabannya
RolandoMySQLDBA

Jawaban:

21

Argumen baris perintah tunduk pada interpretasi oleh shell perintah sistem, mengubah perilaku perintah atau mengubah nilai argumen sebelum diteruskan ke program yang disebut.

Ketika argumen (seperti nilai untuk --password) berisi karakter yang dapat ditafsirkan oleh shell, mereka perlu dikutip (biasanya dilampirkan dalam tanda kutip tunggal 'dalam unix atau penawaran ganda "di Windows) atau melarikan diri secara individual (biasanya dengan backslash \sebelum setiap metacharacter) ) untuk menghindari interpretasi oleh shell.

Sementara karakter spesifik adalah sistem khusus, beberapa karakter yang harus diperhatikan termasuk:

$ & ! \ [ ] < > `

Jika kata sandi, untuk contoh yang sangat buruk, disetel ke 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

Bacaan lebih lanjut:


Pembaruan: untuk keluar dari tanda kutip 'tunggal atau "ganda dalam kata sandi, Anda dapat menghindarinya dengan backslash terkemuka, atau melampirkan seluruh argumen dalam gaya kutipan yang berlawanan jika tidak ada karakter lain yang tidak sesuai dengan gaya kutipan yang dipilih. dengan.

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

Jika Anda memiliki kutipan tunggal dan karakter khusus lainnya juga, Anda terjebak dengan garis miring terbalik karena, dalam unix, kutipan ganda itu "lebih lemah" daripada kutipan tunggal dan banyak metakarakter masih diperluas ketika diapit dengan tanda kutip ganda tetapi tidak tunggal tanda kutip.

Ini bukan khusus MySQL tetapi berlaku untuk apa pun dengan argumen baris perintah.

Anda biasanya dapat menggunakan echoperintah untuk melihat bagaimana shell menafsirkan argumen Anda.

$ 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

Tindak lanjut: Bash shell (dan mungkin beberapa yang lain) memungkinkan lolosnya tanda kutip tunggal dalam string yang dikutip satu kali, meskipun konvensi ini aneh (mungkin didasarkan pada beberapa keputusan yang sudah lama terlupakan yang hilang sekarang akibat kabut waktu):

Ganti setiap 'bagian dalam string dengan '\''sebelum membungkus seluruh string dalam tanda kutip tunggal ... sehingga string literal foo'bardinyatakan sebagai 'foo'\''bar'.

Seperti yang saya katakan, aneh. Ini diperlukan karena backslash lolos dari kuotasi tunggal di luar string yang dikutip tunggal, backslash lolos dari apa pun di dalam string yang dikutip tunggal dalam bash, dan string yang dikutip tunggal dapat ditutup dan dibuka kembali dengan beberapa kutipan tunggal selama tidak ada yang tidak terhindar. karakter campur tangan yang memiliki makna khusus. Jadi '\''tutup kutipan string, lalu sajikan literal yang lolos, lalu buka kembali kutipan string.

Michael - sqlbot
sumber
1
Perlu sedikit klarifikasi. Bagaimana jika tanda kutip tunggal (') datang di bidang kata sandi? Lolos dengan slash () adalah satu-satunya cara?
Praveen Prasannan
Sungguh kejadian yang bersamaan dengan kata sandi server langsung sayapa$$word
Umair
0

Tambahan:

Di Mesin Windows, kami juga kesulitan dengan kata sandi: kata sandi itu berisi kata-kata %yang harus diloloskan sebagai %%(Kutipan saja tidak cukup di sini)

Dognose
sumber