태그 보관물: shell-scripting

shell-scripting

루트 비밀번호없이 MySQL 여정 명령 행에 연결 동일한 bash 스크립트 내에서 MySQL DB를

일부 작업을 위해 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 */;


답변