Shell script에서의 특수문자 사용
Shell
스크립트를 이용해서 Mysql 데이터를 백업하는 mysqldump
작업 로직을 구성하고 싶었다.
가장 간단하게 짜본 스크립트는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
HOST_BETA="HOST_BETA"
HOST_STAGE="HOST_STAGE"
HOST_PROD="HOST_PROD"
PORT="PORT"
USER="USER"
PASSWORD="PASSWORD"
DB="DB"
PHASE=$1
if [ $1 = "beta" ]; then
echo "mysqldump -h$HOST_BETA -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql"
`mysqldump -h$HOST_BETA -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql`
elif [ $1 = "stage" ]; then
echo "mysqldump -h$HOST_STAGE -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql"
`mysqldump -h$HOST_STAGE -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql`
elif [ $1 = "prod" ]; then
echo "mysqldump -h$HOST_STAGE -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql"
`mysqldump -h$HOST_PROD -P$PORT -u$USER -p$PASSWORD --single-transaction --default-character-set=utf8 --extended-insert=FALSE $DB > ./log/$(date +\%Y\%m\%d)_${DB}_$PHASE.sql`
else
echo "Usage:"
echo "(phase:beta or stage or prod)"
exit 0
fi
그런데 자꾸
1
mysqldump: Got error: 1045: Access denied for user 'USER'@'host' (using password: YES) when trying to connec
접속 에러
가 발생하는 것었다.
분명 echo로 나오는 커맨드를 터미널에서 직접 입력했을때는 잘 작동이 되었는데, shell script를 실행했을 때는 에러가 발생했다.
Trouble Shooting 1. shell script ip 문제?
처음에는 에러 메시지에서 host로 나오는 ip가 나의 localhost ip
가 아니고
1
2
3
4
ifconfig
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1400
inet HOST --> HOST netmask 0xffffffff
ifconfig 명령어를 쳤을 때 마지막에 나오는 utun2
가상 인터페이스 호스트가 에러 메시지에 나오길래 shell script에서 가져오는 현재 아이피가 다른 것이라서 MySQL 연결이 안되는건가? 라고 생각을 했다.
하지만 MySQL의 mysql 디비에서 user 접근 권한을 확인해봤더니
1
2
3
4
5
6
7
mysql> use mysql;
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | USER |
+-----------+------------------+
요런식으로 ‘USER’@’%’ 모든 ip
에서 접속 가능하도록 등록이 되어있었다.
이 에러는 원인이 아니었다.
Trouble Shooting 2. 특수문자 문제?
MySQL 접속 비밀번호에는 특수문자
가 포함되어있다.
터미널에서 mysql에 접속하는 커맨드를 이용할 때 비밀번호에 특수문자가 포함되어있다면 \
를 앞에 넣어줘야한다.
예를 들어, 비밀번호가 123!@#
이라면
1
mysql -h HOST -P PORT -u USER -p123\!\@\# DB
이런식으로 특수문자 앞에 \
를 넣어줘야 인식이 된다.
1
2
3
4
5
예시
$ echo (
>
$ echo \(
(
그래서 나는 스크립트에도 같은 식으로 패스워드
를 넣었다. 그런데 shell 에서는 특수문자를 받을 수 있어서 \
라는 문자를 그대로 받아버려서 비밀번호 에러가 발생한 것이었다.
참고 stackoverflow 에서 보면 알 수 있듯이, ""
이런식으로 쌍따옴표
를 이용해서 감싸기도 하나보다.
어쨌든 terminal에서는 \
를 붙여서 특수문자 표기를 하지만 shell
에서는 그렇지 않다.