나는 매우 잘 작동하는 쉘 mysql 백업 스크립트를 구축했습니다.
다음과 같은 특수 문자가 포함된 비밀번호에만 문제가 있습니다
xgT{uic[Is?uJ+
.
다음은 스크립트의 중요한 부분입니다.
#!/bin/sh
FILE=mysql-$db.$DATE.sql.gz
ssh $SUSER@$SHOST "mysqldump -q -u $MUSER -h $MHOST -p$MPASS $db --no-create-db | gzip -9 > $FILE" 2> $ERROR
나는 그것을 다음과 같이 변경했습니다 :
ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR
보시다시피 저는 이미 큰따옴표를 사용해 보았습니다. 하지만 이제 오류가 발생합니다.
bash: $FILE: ambiguous redirect
외부 파일에서 비밀번호와 기타 정보를 가져오고 있습니다.
DB_HOST=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"
내 스크립트 내에서는 외부 파일에서 정보를 가져옵니다.
Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_HOST
DBS=$DB_DATABASE
답변1
비밀번호에는 특수 문자를 이스케이프 처리해야 합니다. 따라서 원래 비밀번호는 (특수 문자 앞에 슬래시가 있음) xgT{uic[Is?uJ+
이어야 합니다 .xgT\{uic\[Is\?uJ\+
이를 수행하기 위해 이미 작성된 다음과 같은 내용을 살펴보고 싶을 수도 있습니다.AutoMySQL백업, 하지만 매일, 매주 또는 매월 백업 순환이 필요한지 잘 모르겠습니다. 그러나 동일한 규칙이 적용되며, 비밀번호에 특수 문자가 포함된 경우 해당 특수 문자를 이스케이프해야 합니다.
도움이 되었기를 바랍니다!
답변2
예. 특수 문자를 피하는 데 도움이 되었습니다.
MPASS=$(printf "%q\n" "$DB_PASS")
그러나 mysqldump에는 여전히 문제가 있었습니다. 나는 마침내 mysqldump가 호스트(-h 호스트 이름)를 알려주지 않을 때 특수 문자가 포함된 비밀번호로만 작동한다는 것을 알게 되었습니다. 이것은 버그인 것 같습니다. 아니면 그렇지 않습니까?
불행히도 mysql 서버가 다른 호스트인 사이트도 있습니다. 따라서 이 솔루션은 완벽하지 않습니다.
답변3
다음과 같이 작성해야 합니다.
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
즉, 명령줄 인수로 사용되는 모든 변수는 따옴표로 묶어 보호해야 합니다. 변수를 큰따옴표로 묶으면 표현식이 단일 값으로 처리되므로 쉘이 이를 단어로 분할하지 않습니다. "
포함된 내용은 "..."
이스케이프 처리되어야 하며 \"
. 더 간단한 해결책은 다음과 같이 포함된 큰따옴표 대신 작은따옴표를 사용하는 것입니다.
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
2> "$ERROR"
마지막으로, 정말로 원격 호스트가 아닌 로컬 호스트에 두려고 했는지 궁금합니다 . 나는 실제로 원격 호스트에서 이를 원했다고 생각합니다. 따라서 이는 원래 명령줄의 또 다른 오류입니다. 그렇다면 해결 방법은 다음과 같습니다.
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"