【问题标题】:Escape special characters from input password string in Bash script从 Bash 脚本中的输入密码字符串中转义特殊字符
【发布时间】:2017-10-05 16:33:53
【问题描述】:

我有一个 Bash 脚本来升级我的数据库架构。

我从终端读取了 MySQL 密码:

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

MYSQL="mysql --force --connect-timeout=90 --host=$db_host -u root -p$db_pass"

但是,如果密码中包含“*”星号等特殊字符,则无法升级架构。我想转义那些特殊字符形式 $db_pass 变量。

【问题讨论】:

  • 只需使用单引号:MYSQL="mysql --force --connect-timeout=90 --host=$db_host -u root -p'$db_pass'" 来保护db_pass 不被shell 扩展。
  • @randomir,我试过了,但没用。谢谢。
  • 尝试执行@randomir 所说的操作,但使用转义的双引号:MYSQL="mysql --force --connect-timeout=90 --host=$db_host -u root -p\"$db_pass\""
  • 另外,请告诉我们您是如何执行该行的。
  • 接下来呢?你得到了这个字符串变量MYSQL,但是如何执行呢?

标签: bash shell


【解决方案1】:

如果可以避免的话,根本不要将命令文本分配给字符串变量。使用函数来存储代码,或使用数组来存储参数列表。 BashFAQ #50 深入讨论了陷阱和避免它的最佳实践。


选项 1:直接调用你的命令

下面的命令就可以了:

mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass"

选项 2:使用函数

考虑以下几点:

RunSQL() {
      mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" "$@"
}

执行完之后,RunSQL foo 将调用您的命令,最后带有 foo


选项 3:使用数组

另一种选择是将参数存储在数组中:

mysql_args=( --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" )
mysql "${mysql_args[@]}" foo

选项 4:让 Shell 为你做逃生

有时,代码生成是不可避免的。在这些情况下,您应该让 shell 完成繁重的工作。

printf -v mysql_cmd '%q ' mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass"

...存储一个值,然后可以使用:

eval "$mysql_cmd"

或在新的 shell 中运行:

bash -c "$mysql_cmd"

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2016-01-05
    • 1970-01-01
    • 2011-12-10
    • 2015-01-19
    相关资源
    最近更新 更多