具有特殊字符的Mysql命令行密码无效

时间:2017-10-10 09:47:38

标签: mysql bash

我使用以下bash脚本来升级我的数据库架构。脚本从命令行读取主机名和数据库密码。

问题在于,如果密码为字母数字,例如 r00t ,则脚本可以正常工作。但如果密码包含特殊字符,例如 pa ** w0rd ,则脚本不起作用并直接退出。请帮我解决一下这个。感谢。

#!/bin/bash

echo "Enter hostname."
read -p "Hostname [localhost]: " DB_HOST
DB_HOST=${DB_HOST:-localhost}

echo "Enter MySQL root password"
DB_PASS=
while [[ $DB_PASS = "" ]]; do
   read -sp "Password: " DB_PASS
done

MYSQL="mysql --force --connect-timeout=90 --host=$DB_HOST -u root --password=${DB_PASS}"

# Apply schema updates. My DBName is "mydb"
# Upgrade schema file is stored in "mysql" folder

$MYSQL mydb -e exit > /dev/null 2>&1 && $MYSQL mydb < "../mysql/upgrade_schema_v.2.1.sql"

4 个答案:

答案 0 :(得分:8)

使用bash登录mysql

对于ubuntu或linux shell,请尝试使用命令

mysql -u username -p'p@ssw()rD'

供远程主机登录使用

mysql -h hostname -u user -p'password'

答案 1 :(得分:3)

之所以发生这种情况,是因为您在密码中使用了shell GLOB(通配符)字符,而在Bash中(或通常在Linux上),shell会扩展通配符。

最安全,最可靠的解决方案是不要在密码中使用shell通配符或shell解释的其他字符。你也应该避免空格。还有很多其他角色。

以下是您应该避免的:

  

“'$,[] *?{}〜#%\&lt;&gt; | ^;

以下是通常可以安全使用的:

  

:@。 ,/ + - ! =

要确保密码仍然安全,请将密码设置得更长。举个例子:

  

沃顿3amvv7l1wz1192sjqhym

这符合老式的密码复杂性规则,因为上,下,数字和特殊字符在前四个中,其余部分是随机生成的,但避免出现任何有问题的字符。

但是如果你必须使用它们,你可以用单引号引用密码参数 - 但如果密码包含单引号,你仍然会遇到麻烦!

答案 2 :(得分:0)

请尝试用单引号括起您的密码。

如果是pa**w0rd,请使用'pa**w0rd'

答案 3 :(得分:0)

变量最适合用于数据,而不是代码。当您想要扩展的某些部分时(即,您希望命令行在您想要的标记上进行分词),变量层使得难以保护扩展,但不想要所有其他效果。解决方案是不将代码存储在字符串中。相反,使用如下函数:

do_mysql() {
    host="$1"
    pass="$2"
    mysql --force --connect-timeout=90 --host="$host" -u root --password="$pass" "$@"
}

然后你可以用额外的参数来运行它,比如

do_mysql "$DB_HOST" "$DB_PASS" -e exit > /dev/null && do_mysql "$DB_HOST" "$DB_PASS" < "../mysql/upgrade_schema_v.2.1.sql"

虽然最好不要为变量使用大写。这样做可以使您与环境变量发生冲突并意外更改您不打算更改的内容(因为意外重置PATH的人数可以证明)。