mysql 명령 행에 비밀번호를 전달하는 방법


20

foo.php예를 들어 P455w0rd, 사용하려고 할 때 MySQL 비밀번호를 파일에 저장 했습니다.

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

두 옵션 모두 여전히 암호를 묻습니다. 암호를 보내는 올바른 방법은 stdin무엇입니까?


3
-p와 비밀번호 사이에 공백이 없어야 합니다.
Fırat KÜÇÜK

mysql이 stdin에서 비밀번호를 읽지 못하므로 읽은 내용을 알 수 없었습니다.
Omn

정답은 액세스 권한이있는 사람 /proc이 프로그램이 실행되는 동안 비밀번호를 쉽게 읽을 수 있는 명령 줄에 비밀번호를 넣지 않는 것 입니다. 그것이 바로 ~/.my.cnf0600으로 chmod'ed 된 것입니다
Shadur

답변:


25

조심하지 않으면 명령 줄에 암호를 전달하는 방법에 매우주의해야합니다.주의하지 않으면와 같은 도구를 사용하여 스니핑 할 수 ps있습니다.


이를 수행하는 가장 안전한 방법은 새 구성 파일을 작성 하거나 또는 명령 행 옵션 을 mysql사용하여 전달하는 것 입니다.--defaults-file=--defaults-extra-file=

이 둘의 차이점은 기본 구성 파일 외에도 후자를 읽는 반면 전자는 인수로 전달 된 하나의 파일 만 사용한다는 것입니다.

추가 구성 파일에는 다음과 비슷한 내용이 포함되어야합니다.

[client]
user=foo
password=P@55w0rd

이 파일을 보호하십시오.

그런 다음 다음을 실행하십시오.

mysql --defaults-extra-file=<path to the new config file> [all my other options]

2
MySQL은 플래그에 argv지정된 매개 변수를 덮어 쓰도록 수정합니다 -p. 적어도 그것은 다른 관련 정보와 함께 여기에서 결론 지어진 것입니다
Kusalananda

보안을 측정 할 수있는 최상의 솔루션입니다. go-rwx를 chmod하고이 인수가 다른 모든 인수보다 우선해야합니다.
ChuckCottrill

1
@Kusalananda는, 그래,하지만에 대한 의견에 따라 unix.stackexchange.com/q/385339/135943 , 그것은 하지 않는 것이 안전 의미!
와일드 카드

--login-path지원된다는 메모를 추가 할 가치가 있습니다 . 이보다 훨씬 낫지는 않지만 내용을 평문으로 변환하는 장벽이 낮더라도 평문이 약간 적습니다.
Geoffrey Wiseman 1

6
환경 ( export MYSQL_PWD=muhpassword) 에서 MYSQL_PWD를 설정 하고 -p. 없이 명령을 실행하십시오 . MySQL 프로그램 환경 변수를 참조하십시오 . 매뉴얼의 심각한 경고 에도 불구하고 , 이것은 다소 안전 합니다. 나중에 같은 쉘에서 이상한 warez를 시작하지 않는 한. MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer

12

mysql클라이언트 유틸리티 중 하나를 사용하여 명령 줄에 암호를 취할 수 있습니다 -p또는 --password=옵션.

를 사용하는 경우 -p옵션 문자 다음에 공백이 없어야합니다.

$ mysql -pmypassword

나는 스스로 문서화하기 때문에 스크립트에서 긴 옵션을 선호합니다.

mysql --password=mypassword --user=me --host=etc

3
모든 사용자가 직접 /proc/$pid/cmdline또는 ps명령을 통해 비밀번호를 볼 수 있기 때문에 안전하지 않습니다 . mysql은 시작하는 동안 argv의 암호를 덮어 쓰지만 다른 사용자가 암호를 관찰 할 수있는 시간 창이 항상 있다는 것은 사실입니다. 또한 일부 시스템에서는 argv 덮어 쓰기가 작동하지 않을 수 있습니다.
maxschlepzig

3

mysql비밀번호 로 시작 하려면 먼저 변수에서 비밀번호를 가져와야합니다.

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

그런 다음 다음을 사용하여 mysql명령을 시작할 수 있습니다 .

mysql -U root -p ${MYSQLPASS} mydb -h friendserver

1
이것은 또한 암호 보안을 위태롭게합니다 . 을 지정하지 않으면 MYSQL_PWD읽을 환경 변수가 mysql있습니다 -p. 그리고 Linux에서는 인수 벡터와 달리 사용자의 환경을 다른 우선 순위가없는 사용자가 읽을 수 없으므로 안전한 방법입니다.
maxschlepzig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.