mysqladmin не использует встроенный пароль

10

Я пытаюсь настроить работу cron для резервного копирования с моей ведомой машины. Поэтому мне нужно остановить раба

Я дал команду

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

Но это бросает ошибку:

mysqladmin: ошибка подключения к серверу при локальном хосте: ошибка: «Доступ запрещен для пользователя root» @ «localhost» (с использованием пароля: ДА)

Сейчас попробовал с командой

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

Он запрашивает пароль, и я дал, как test_passи все было хорошо.

Почему так случилось? Какая альтернатива?

NB: Кстати моя версия mysql mysql-5.0.95-5, это имеет какой-то смысл.

Правин Прасаннан
источник
У вашего пароля есть какие-то специальные символы, которые может интерпретировать оболочка? Вы пытались заключить пароль в «кавычки» или «кавычки»?
Майкл - sqlbot
Какие специальные символы могут интерпретировать оболочки? есть ли документация?
Правин Прасаннан
1
Символы типа $ &! \ [] <> все приходят на ум как потенциально проблемные. Заключение пароля в 'одинарные кавычки должно предотвратить эту проблему. gnu.org/software/bash/manual/bashref.html#Quoting
Майкл - sqlbot
2
отлично .. работает. Я хотел бы отметить это как ответ. Можете ли вы поставить это как ответ
Правин Прасаннан
@ 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, а строки с одинарными кавычками могут закрываться и открываться несколькими одинарными кавычками, если нет неоткрытых строк. промежуточные символы, которые имеют особое значение. Поэтому '\''закрывает цитирование строки, затем предоставляет экранированный литерал, а затем снова открывает цитирование строки.

Майкл - sqlbot
источник
1
Нужно немного больше разъяснений. Что если одинарные кавычки (') появятся в поле пароля? Избежать его с помощью слеша () - единственный способ?
Правин Прасаннан
Какое совпадение, что пароль моего живого сервера установленpa$$word
Umair
0

Дополнение:

На Windows-машине мы также боролись с паролем: он содержал то, %что нужно экранировать как %%(одних только цитат здесь недостаточно)

dognose
источник