mysqladmin nie przyjmuje wbudowanego hasła


10

Próbuję ustawić zadanie CRON do pobierania kopii zapasowej z mojej maszyny slave. Więc muszę zatrzymać niewolnika

Wydałem polecenie

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

Ale rzuca błąd:

mysqladmin: połączenie z serwerem na „localhost” nie powiodło się błąd: „Odmowa dostępu dla użytkownika„ root ”@„ localhost ”(przy użyciu hasła: TAK)”

Teraz próbowałem z poleceniem

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

Prosi o podanie hasła, a ja podałem jako test_passi wszystko było w porządku.

Dlaczego tak się stało? Jaka jest alternatywa?

Uwaga: BTW moja wersja mysql jest mysql-5.0.95-5, to ma sens.


Czy twoje hasło ma jakieś znaki specjalne, które może interpretować powłoka? Czy próbowałeś zawrzeć hasło w „cudzysłowach” lub „cudzysłowach”?
Michael - sqlbot

jakie znaki specjalne może interpretować powłoka? czy jest jakaś dokumentacja?
Praveen Prasannan

1
Znaki takie jak $ &! \ [] <> przychodzą na myśl jako potencjalnie problematyczne. Umieszczenie hasła w 'pojedynczych cudzysłowach powinno zapobiec temu problemowi. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot

2
świetnie .. działa. Chciałbym zaznaczyć to jako odpowiedź. Czy możesz ująć to jako odpowiedź
Praveen Prasannan

@ Michael-sqlbot tak, powinieneś opublikować jako odpowiedź
RolandoMySQLDBA

Odpowiedzi:


21

Argumenty wiersza poleceń podlegają interpretacji przez systemową powłokę poleceń, zmieniając zachowanie polecenia lub zmieniając wartość argumentów przed przekazaniem ich do wywoływanego programu.

Gdy argument (taki jak wartość dla --password) zawiera znak, który powłoka może interpretować, należy go albo zacytować (zwykle ująć w pojedyncze cudzysłowy w systemie 'Unix lub podwójny cudzysłów "w systemie Windows), albo uciec indywidualnie (zwykle odwrotnym ukośnikiem \przed każdym metaznakiem ), aby uniknąć interpretacji przez powłokę.

Podczas gdy określone znaki są specyficzne dla systemu, niektóre znaki, na które należy uważać, obejmują:

$ & ! \ [ ] < > `

Jeśli hasło, na naprawdę zły przykład, zostało ustawione na 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

Dalsza lektura:


Aktualizacja: aby uciec 'pojedynczemu lub "podwójnemu cudzysłowowi w haśle, możesz uciec przed nimi ukośnikiem odwrotnym lub umieścić cały argument w odwrotnym stylu cudzysłowów, jeśli nie ma innych znaków, których wybrany styl cytowania nie jest zgodny z.

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

Jeśli masz pojedynczy cytat, a także inne znaki specjalne, utkniesz z ukośnikiem odwrotnym, ponieważ w systemie uniksowym podwójny cytat jest „słabszy” niż pojedynczy cytat, a wiele metaznaków jest nadal rozwiniętych, gdy jest ujętych w podwójny cudzysłów, ale nie w pojedyncze cytaty.

Nie jest to specyficzne dla MySQL, ale dotyczy wszystkiego z argumentami wiersza poleceń.

Zazwyczaj możesz użyć tego echopolecenia, aby zobaczyć, jak powłoka interpretuje twoje argumenty.

$ 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

Dalsze działania: Powłoka bash (i przypuszczalnie niektóre inne) pozwala na unikanie pojedynczych cudzysłowów w ciągach pojedynczych cudzysłowów, chociaż konwencja jest dziwna (prawdopodobnie oparta na dawno zapomnianej decyzji zagubionej w mgiełce czasu):

Zastąp każdy 'z nich '\''przed owijaniem całego łańcucha pojedynczymi cudzysłowami ... więc literał foo'barjest wyrażony jako 'foo'\''bar'.

Jak powiedziałem, dziwne. Jest to konieczne, ponieważ ukośnik odwrotny unika pojedynczego cudzysłowu poza ciągiem pojedynczego cudzysłowu, odwrotny ukośnik nic nie unika w bash ciągu pojedynczego cudzysłowu, a ciągi pojedynczego cudzysłowu można zamykać i ponownie otwierać za pomocą wielu pojedynczych cudzysłowów, o ile nie ma nieokreślonego interweniujące postacie o specjalnym znaczeniu. Tak więc '\''zamyka cytowanie łańcucha, a następnie podaje znak ucieczki, a następnie ponownie otwiera cytowanie łańcucha.


1
Potrzebujesz więcej wyjaśnień. Co jeśli pojedyncze cudzysłowy (') pojawią się w polu hasła? Ucieczka z ukośnikiem () to jedyny sposób?
Praveen Prasannan

Co za incydent, w którym ustawione jest hasło mojego serwera na żywopa$$word
Umair,

0

Dodanie:

Na maszynie z systemem Windows również zmagaliśmy się z hasłem: zawierało ono hasło, %które należy uciec %%((same cytaty tutaj nie wystarczą)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.