带有特殊字符的 Shell 脚本密码

带有特殊字符的 Shell 脚本密码

我已经构建了一个 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 不会将其拆分为单词。请注意,"嵌入的 within"..."需要转义,并写为\"。更简单的解决方案是使用单引号代替嵌入的双引号,如下所示:

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'"

相关内容