루트 비밀번호없이 MySQL 여정 명령 행에 연결


11

일부 작업을 위해 Bash 스크립트를 작성 중입니다. 이러한 작업 중 하나는 동일한 bash 스크립트 내에서 MySQL DB를 만드는 것입니다. 내가 지금하고있는 일은 두 가지 변수를 만드는 것입니다. 하나는 상점 사용자 이름과 다른 하나는 상점 비밀번호입니다. 이것은 내 스크립트의 관련 부분입니다.

MYSQL_USER=root
MYSQL_PASS=mypass_goes_here

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql

그러나 항상 암호가없는 사용자 루트에 대한 액세스가 거부되었다는 오류가 발생합니다. 내가 잘못한 것은 무엇입니까? PostgreSQL에 대해서도 동일한 작업을 수행해야합니다.


디버깅 (-: 줄에 echo "$MYSQL_PASS"전달하기 전에 시도하십시오 mysql. 올바른 암호를 가지고 있습니까?
KM.

스크립트없이 평소처럼 로그인 할 수 있습니까?
qweet

4
-h 가 없습니다. 암호를 명령 줄에 입력하는 것은 좋지 않습니다 ps wwaux. 전화하는 모든 사람에게 암호가 표시되기 때문입니다 .
Nils

답변:


23

MySQL 및 PostgreSQL의 경우 로컬 구성 파일에서 사용자 및 비밀번호를 지정할 수 있습니다. MySQL의 경우 .my.cnf, PostgreSQL의 경우 .pgpass 이러한 파일은 홈 디렉토리 (예 : ~ / .my.cnf)에 있어야합니다.

.my.cnf :

[mysql]
user=user
password=password

.pgpass :

host:port:database:user:password

******* 대신 임의의 필드로 대체하여 와일드 카드를 입력 할 수 있습니다.

추신 : 명령 줄에 암호를 지정하지 마십시오! 시스템이 다른 사용자에게 속한 프로세스를 표시하지 않도록 구성되어 있으면 ps 로 완벽하게 볼 수 있습니다 .

@thinice : 그 파일들을 정말로 안전하게 만들고 싶다면 다음을 수행해야합니다.

umask 077
touch .my.new.config
umask 022 # or whatever was your default

이렇게하면 처음부터 보안 권한으로 파일이 생성되고 도청자가 암호를 해독 할 가능성이 없습니다.

PostgreSQL은 어쨌든 0600 이상의 권한을 가진 파일 사용을 거부합니다.


1
mysql mysql 클라이언트의 경우으로 특정 구성 파일을 가리킬 수 있습니다 --defaults-extra-file=filename. 비표준 위치에 배치하거나 임시 파일을 만들려는 경우에 유용 할 수 있습니다. PostgreSQL과 비슷한 옵션이라고 생각되지만 익숙하지는 않습니다.
Zoredache

1
그리고 행복 길모어 반바지의 사랑을 그 파일에 chmod0600
thinice

@kworr 내가 aready 것을 시도 할 것이다 그러나 나의 MySQL은 원인을 모르는 :( /etc/my.cnf에에서이 매개 변수를 변경 시작되지 않습니다 나중에 다시 시도 할 것이다.
ReynierPM

/etc/my.cnf가 아닙니다. 답변을 업데이트합니다.
kworr

@kworr 나는 당신의 해결책을 시도하지만 전혀 작동하지 않습니다. DB는 비어있는 것으로 만들어졌으며 phpMyAdmin 또는 다른 GUI 도구에는 나타나지 않습니다. /etc/my.cnf의 데이터 디렉토리를 datadir = / data / var / lib / mysql로 ​​설정하고 / data / var / lib / mysql에서 권한을 0755로 설정하고 mysql : mysql의 소유자도 설정했습니다. 데이터베이스가 비어있는 이유 ? 문제는 어디에 있습니까?
ReynierPM 2016 년

2
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"

mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1

STATUS=$? 
if [ $STATUS -eq 0 ];
then 
    echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
    echo -e "Database '$DBNAME' already exists"
else
    echo -e "Failed to create database '$DBNAME'"
fi

rm -r /tmp/error1 

이 트릭을 할 것입니다 감사합니다


2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

안전한 비밀번호로 명령 행을 어떻게 실행합니까? 구성 편집기를 사용하십시오 !!!

mysql 5.6.6부터는 설정 파일에 비밀번호를 저장하고 다음과 같은 cli 명령을 실행할 수 있습니다.

mysql --login-path=storedPasswordKey ....

--login-path는 변수, 호스트, 사용자 및 비밀번호를 대체합니다. 맞아요!



1
공유해 주셔서 감사합니다! 이 방법에는 하나의 문제가 있습니다. --login-path 매개 변수는 호출의 첫 번째 매개 변수 여야합니다. 그렇지 않으면 "알 수없는 변수 'login-path = local'"메시지가 표시됩니다.
André Augusto

1
MYSQL_USER="root"
MYSQL_PASS="mypass_goes_here"

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password=$MYSQL_PASS < /tmp/script.sql
rm -rf /tmp/script.sql

패스를 어떻게 작성하고 탈출하지 않는지 확인하십시오

--defaults-extra-file =은 좋은 것입니다 (tm) (c)



1

비슷한 질문 이 StackOverflow에 존재합니다.

거기에서 내 대답 을 요약 합니다.

당신은 할 수 있습니다 export MYSQL_PWD=yourverysecretpassword.

구성 파일을 사용하는 것보다이 방법의 단점은 스크립트와 동기화하기 위해 별도의 구성 파일이 필요하지 않다는 것입니다. 유지 관리 할 스크립트 만 있습니다.

이 방법 에는 단점없습니다 .

암호는 시스템의 다른 사용자에게 표시 되지 않습니다 (명령 행에있는 경우 표시됨). 환경 변수는 mysql 명령 및 root를 실행하는 사용자 만 볼 수 있습니다.

암호는 스크립트 자체를 읽을 수있는 모든 사람에게도 표시되므로 스크립트 자체를 보호해야합니다. 이것은 구성 파일을 보호하는 것과 다르지 않습니다. 스크립트를 공개적으로 읽을 수있게하려면 별도의 파일에서 비밀번호를 제공 할 수 있습니다 export MYSQL_PWD=$(cat /root/mysql_password). 구성 파일을 작성하는 것보다 변수를 내보내는 것이 여전히 쉽습니다.

예 :

$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.