Home [Shell] Shell script에서의 특수문자 사용
Post
Cancel

[Shell] Shell script에서의 특수문자 사용

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에서는 그렇지 않다.

This post is licensed under CC BY 4.0 by the author.