mysqladmin은 인라인 암호를 사용하지 않습니다


10

슬레이브 시스템에서 백업을 수행하기 위해 크론 작업을 설정하려고합니다. 그래서 노예를 막아야합니다

나는 명령을 내렸다

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

그러나 오류가 발생합니다.

mysqladmin : 'localhost'에서 서버 연결 실패 오류 : '사용자'root '@'localhost '에 대한 액세스가 거부되었습니다 (비밀번호 사용 : YES)'

이제 나는 명령으로 시도했다.

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

암호를 묻는 메시지가 표시 test_pass되고 모든 것이 잘되었습니다.

왜 그렇게 되었습니까? 대안은 무엇입니까?

NB : BTW mysql 버전은 mysql-5.0.95-5입니다.


암호에 쉘이 해석 할 수있는 특수 문자가 있습니까? 'quotes'또는 "quotes"로 비밀번호를 묶어 보셨습니까?
Michael-sqlbot

쉘이 해석 할 수있는 특수 문자는 무엇입니까? 문서가 있습니까?
Praveen Prasannan

1
$ &! 같은 문자 \ [] <>는 모두 잠재적으로 문제가있는 것으로 생각됩니다. 작은 '따옴표로 비밀번호를 묶으면 해당 문제를 방지 할 수 있습니다. gnu.org/software/bash/manual/bashref.html#Quoting
Michael-sqlbot

2
훌륭합니다 .. 일. 이것을 답변으로 표시하고 싶습니다. u는 대답으로 넣어주세요 수
프라 빈 Prasannan

@ Michael-sqlbot 예 게시해야합니다.
RolandoMySQLDBA

답변:


21

명령 행 인수는 시스템의 명령 쉘에 의해 해석되어 명령의 동작을 변경하거나 인수가 호출 된 프로그램에 전달되기 전에 인수의 값을 변경합니다.

인수 (예 :에 대한 값 --password)에 쉘이 해석 할 수있는 문자가 포함 된 경우, 인용 부호 (일반적으로 '유닉스 에서는 작은 따옴표로 묶 거나 "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

작은 따옴표와 다른 특수 문자가있는 경우 유닉스에서는 큰 따옴표가 작은 따옴표보다 "약한"이며 큰 따옴표로 묶었을 때 많은 메타 문자가 확장되지만 작은 따옴표는 아니기 때문에 백 슬래시 이스케이프가 발생합니다. 인용 부호.

이것은 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

부가:

윈도우 머신에, 우리는뿐만 아니라 비밀번호로 고생 : 그것은 포함 %로 이스케이프 할 필요 %%(지수가 혼자 충분하지 않습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.