[mysql] 터미널 내에서 mysql을 사용하여 경고 메시지를 표시하지 않지만 bash 스크립트로 작성된 암호

터미널 내에서 MySQL에서 다음 명령을 실행하려고했을 때 :

mysql -u $user -p$password -e "statement"

실행은 예상대로 작동하지만 항상 경고를 발행합니다.

경고 : 명령 행 인터페이스에서 비밀번호를 사용하면 안전하지 않을 수 있습니다.

그러나 $password터미널 내에서 bash 스크립트에서 반복적으로 명령을 실행하고 싶기 때문에 프롬프트가 표시되는 것을 기다리는 것을 좋아하지 않기 때문에 암호를 저장 하는 환경 변수 ( )를 사용하여 위의 명령문을 수행 해야합니다. 한 번의 스크립트로 비밀번호를 50 번 또는 100 번 입력하도록 강요했습니다. 여기 내 질문이 있습니다.

  • 경고를 억제하는 것이 가능합니까? 내가 말한대로 명령이 제대로 작동하지만 반복하여 명령을 50 또는 100 번 실행할 때 창이 지저분 해집니다.

  • 경고 메시지를 준수하고 스크립트에 비밀번호를 쓰지 않아야합니까? 이 경우 프롬프트가 표시 될 때마다 비밀번호를 입력해야합니까?

달리는 man mysql것은 도움이되지 않습니다.

--show-warnings
각 명령문 뒤에 경고가 표시됩니다. 이 옵션은 대화식 및 배치 모드에 적용됩니다.

내가 빠진 것이 없다면 기능을 끄는 방법에 대해서는 언급하지 않았습니다.

OS X 10.9.1 Mavericks를 사용하고 있으며 homebrew에서 MySQL 5.6을 사용합니다.



답변

MySQL 클라이언트 / 서버 버전이 5.6.xa 방법 인 경우 WARNING 메시지가 mysql_config_editor 도구를 사용하지 않도록하십시오 .

mysql_config_editor set --login-path=local --host=localhost --user=username --password

그런 다음 쉘 스크립트에서 사용할 수 있습니다.

mysql --login-path=local  -e "statement"

대신에:

mysql -u username -p pass -e "statement"


답변

나는 다음과 같은 것을 사용한다 :

mysql --defaults-extra-file=/path/to/config.cnf

또는

mysqldump --defaults-extra-file=/path/to/config.cnf 

config.cnf에 다음이 포함됩니다.

[client]
user = whatever
password = whatever
host = whatever

이를 통해 다른 서버 / 역할 / 데이터베이스에 대해 여러 구성 파일을 가질 수 있습니다. ~ / .my.cnf를 사용하면 하나의 구성 세트 만 사용할 수 있습니다 (유용한 기본값 세트 임).

데비안 기반 배포판에 있고 루트로 실행중인 경우 위를 건너 뛰고 /etc/mysql/debian.cnf를 사용하여 …

mysql --defaults-extra-file=/etc/mysql/debian.cnf


답변

편리한 (그러나 동일하게 안전하지 않은) 방법 중 하나는 다음을 사용하는 것입니다.

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

공식 문서는 권장하지 않습니다.
참조 (버전 5.6 수동 MySQL의) 암호 보안에 대한 6.1.2.1 최종 사용자 지침 :

MYSQL_PWD환경 변수에 비밀번호 저장

MySQL 비밀번호를 지정하는이 방법은 매우 안전하지 않은 것으로 간주되어 사용해서는 안됩니다. 일부 ps 버전 에는 실행중인 프로세스 환경을 표시하는 옵션이 포함되어 있습니다. 일부 시스템에서을 설정하면 psMYSQL_PWD 를 실행하는 다른 사용자에게 비밀번호가 노출됩니다 . 이러한 ps 버전이없는 시스템에서도 사용자가 프로세스 환경을 검사 할 수있는 다른 방법이 없다고 가정하는 것은 현명하지 않습니다.


답변

커맨드 라인에서 암호를 사용하려면 특정 오류 메시지를 필터링하는 데 효과적이라는 것을 알았습니다.

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

기본적으로 표준 오류를 표준 출력으로 리디렉션하고 grep을 사용하여 “경고 : 암호 사용”과 일치하는 모든 행을 삭제합니다.

이런 식으로 오류를 포함한 다른 출력을 볼 수 있습니다. 나는 이것을 다양한 쉘 스크립트 등에 사용합니다.


답변

다음은 일일 mysqldump 데이터베이스 백업을위한 bash 스크립트를보다 안전하게 작동시키는 방법입니다. 이것은 크리스티안 포르타의 위대한 답변의 확장입니다.

  1. 먼저 mysql_config_editor (mysql 5.6+와 함께 제공)를 사용하여 암호화 된 비밀번호 파일을 설정하십시오. 사용자 이름이 “db_user”라고 가정하십시오. 쉘 프롬프트에서 실행 :

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password

    암호를 묻는 메시지가 나타납니다. 입력하면 사용자 / 패스가 암호화되어 저장됩니다.home/system_username/.mylogin.cnf

    물론 “system_username”을 서버의 사용자 이름으로 변경하십시오.

  2. bash 스크립트를 다음과 같이 변경하십시오.

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz

    이에:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz

더 이상 노출 된 비밀번호가 없습니다.


답변

가장 쉬운 방법은

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null


답변

로그인 경로를 지정할 때 스크립트에서 mysql_config_editor를 실행하여 비밀번호를 전달할 수도 있습니다.

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

그러면 스크립트에서 프롬프트와 상호 작용하기 위해 사용할 수있는 예상 세션이 시작됩니다.

이 게시물보기