일부 작업을 위해 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에 대해서도 동일한 작업을 수행해야합니다.
답변
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 이상의 권한을 가진 파일 사용을 거부합니다.
답변
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
이 트릭을 할 것입니다 감사합니다
답변
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password
안전한 비밀번호로 명령 행을 어떻게 실행합니까? 구성 편집기를 사용하십시오 !!!
mysql 5.6.6부터는 설정 파일에 비밀번호를 저장하고 다음과 같은 cli 명령을 실행할 수 있습니다.
mysql --login-path=storedPasswordKey ....
–login-path는 변수, 호스트, 사용자 및 비밀번호를 대체합니다. 맞아요!
답변
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 =은 좋은 것입니다 ™ (c)
답변
따옴표는 암호의 일부로 간주되므로 암호를 따옴표로 묶지 마십시오.
답변
비슷한 질문 이 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 */;