mysqladmin не приймає вбудований пароль


10

Я намагаюся встановити cron для отримання резервного копіювання з мого раб-машини. Тому мені потрібно зупинити раба

Я видав команду

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

Але це помилка кидання:

mysqladmin: помилка підключення до сервера на "localhost": "Доступ заборонено для користувача" root "@" localhost "(з використанням пароля: ТАК)"

Тепер я спробував із командою

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

Підкаже пароль і я дав як test_passі все було добре.

Чому так сталося? Яка альтернатива?

NB: До речі, моя версія mysql - mysql-5.0.95-5це має сенс.


Чи є у вашого пароля якісь спеціальні символи, які оболонка може інтерпретувати? Ви намагалися вкласти пароль у "котирування" чи "цитати"?
Майкл - sqlbot

які спеціальні символи, які оболонка може отримати інтерпретацію? чи є документація?
Praveen Prasannan

1
Таких персонажів, як $ &! \ [] <> всі вони приходять в голову як потенційно проблемні. Закриття пароля в 'одиничних лапках повинно запобігти цій проблемі. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot

2
чудово .. працюючи. Я хотів би відзначити це як відповідь. Чи можете ви, будь ласка, поставити це як відповідь
Praveen Prasannan

@ Michael-sqlbot так, що ви повинні опублікувати, як відповідь
RolandoMySQLDBA

Відповіді:


21

Аргументи командного рядка підлягають інтерпретації командною оболонкою системи, змінюючи поведінку команди або змінюючи значення аргументів до того, як вони будуть передані в викликану програму.

Коли аргумент (наприклад, значення для --password) містить символ, який може інтерпретувати оболонка, їх потрібно або цитувати (як правило, укладені в єдині лапки)' в unix, або подвійну лапочку "в Windows) або уникати окремо (зазвичай із зворотною косою рисою \перед кожним метахарактером ) щоб уникнути тлумачення оболонкою.

Хоча конкретні символи характерні для системи, деякі символи, на які слід стежити, включають:

$ & ! \ [ ] < > `

Якщо пароль, для справді поганого прикладу, був встановлений 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

Якщо у вас є також одна цитата та інші спеціальні символи, ви застрягли у втечі зворотної косої риси, тому що, в unix, подвійна цитата є "слабкішою", ніж одна цитата, і багато метахарактерів все ще розширюються, коли додаються до подвійних лапок, але не одиничні цитати.

Це не специфічно для 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

Наступні дії: оболонка bash (і, мабуть, деякі інші) дозволяє уникати одинарних лапок у рядках з одним цитуванням, хоча конвенція є химерною (ймовірно, заснованою на деякому давно забутому рішенні, втраченому зараз у туманах часу):

Замініть кожну 'внутрішню рядок на, '\''перш ніж загортати всю рядок в одиничні лапки ... так буквальна рядок foo'barвиражається як 'foo'\''bar'.

Як я вже казав, химерні. Це потрібно, тому що косої косий рядок виходить з однієї цитати поза однієї рядком, котирується, зворотній косої риски не уникне нічого в межах рядка з одним котируванням у bash, а окремі рядки, що цитуються, можуть бути закриті та повторно відкриті декількома одиничними цитатами до тих пір, поки не буде відмінено втручаються персонажі, які мають особливе значення. Таким чином, '\''закривається цитування рядка, потім постачається відмічений літерал, а потім знову відкривається цитування рядка.


1
Потрібно трохи більше роз’яснень. Що робити, якщо одиничні лапки (') надходять у поле пароля? Уникнути його за допомогою косого () - це єдиний спосіб?
Praveen Prasannan

Що за спільний інцидент, встановлений паролем мого сервера в реальному часіpa$$word
Umair

0

Доповнення:

На машині Windows ми також боролися з паролем: він містив, %який потрібно уникати як %%(Котирування одного тут недостатньо)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.