我有以下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"
Run Code Online (Sandbox Code Playgroud)
小智 14
使用bash登录mysql
对于ubuntu或linux shell尝试使用命令
mysql -u username -p'p@ssw()rD'
Run Code Online (Sandbox Code Playgroud)
供远程主机登录使用
mysql -h hostname -u user -p'password'
Run Code Online (Sandbox Code Playgroud)
发生这种情况的原因是,您在密码中使用了外壳GLOB(通配符)字符,而在Bash中(或通常在Linux上),通配符会被外壳扩展。
最安全,最可靠的解决方案是不要使用外壳通配符或密码中外壳解释的其他字符。您还应该避免空格。还有很多其他字符。
以下是应避免的情况:
“'$,[] *?{}〜#%\ <> | ^;
以下是通常可以安全使用的工具:
:@ ,/ +-!=
为确保密码仍然安全,请延长密码。举个例子:
K @ 3amvv7l1wz1192sjqhym
这符合老式的密码复杂性规则,因为前四位是大写,小写,数字和特殊字符,其余部分是随机生成的,但可以避免出现任何有问题的字符。
但是,如果必须使用它们,则可以用单引号将password参数引起来-尽管如果密码包含单引号,仍然会遇到麻烦!