我已經建立了一個 shell 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\+
(特殊字元前的斜線)。
您可能還想查看已經為此編寫的內容,例如自動MySQL備份,但我不確定您是否需要每日、每週或每月備份輪替。但是,如果密碼包含特殊字符,則需要轉義這些特殊字符,同樣的規則也適用。
希望有幫助!
答案2
是的。它有助於轉義特殊字元:
MPASS=$(printf "%q\n" "$DB_PASS")
但是mysqldump還是有問題。我終於發現,當我不告訴 mysqldump 主機(-h 主機名稱)時,mysqldump 僅適用於帶有特殊字元的密碼。這似乎是一個錯誤。或者不是嗎?
不幸的是,我也有一些網站,其中 mysql 伺服器是其他主機。所以這個解決方案並不完美。
答案3
你應該這樣寫:
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
也就是說,所有用作命令列參數的變數都應該用引號括起來來保護。變數周圍的雙引號確保表達式被視為單一值,因此 shell 不會將其拆分為單字。請注意,"
embedded inside"..."
需要轉義,並寫為\"
。一個更簡單的解決方案是使用單引號而不是嵌入的雙引號,如下所示:
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'"