【问题标题】:How to pass password from file to mysql command?如何将密码从文件传递到mysql命令?
【发布时间】:2019-07-29 08:04:09
【问题描述】:

我有一个 shell 脚本,它使用来自外部文件的一个参数调用 mysql 命令,它看起来像这样(我也在其他资源中看到了这个示例):

mysql --user=root --password=`cat /root/.mysql`

它不工作:

无法连接到 MySQL 服务器:用户 'root'@'localhost' 的访问被拒绝(使用密码:YES)。

我尝试了不同的报价但没有成功。如何通过?

更新 1: 发现我可以在没有空格符号的情况下传递密码。问题在于,我的 root pass 包含空格。

【问题讨论】:

    标签: mysql shell unix


    【解决方案1】:

    将您的密码存储在受保护的 mysql cnf 文件中:

    install -m 700 -d /srv/secrets/
    install -m 600 /dev/null /srv/secrets/root@localhost.cnf
    editor /srv/secrets/root@localhost.cnf
    

    将密码存储在 client.password ini 属性中

    [client]
    password="password"
    

    将此文件作为first argument 包含在您的mysql 命令中:

    mysql \
        --defaults-extra-file=/srv/secrets/root@localhost.cnf \
        --user=root \
        --host=localhost \
        --no-auto-rehash
    

    【讨论】:

    • 这行得通。也可以在同一个文件中传递主机和用户名,而无需在命令中单独传递它们。
    【解决方案2】:

    使用与mysql客户端一起安装的mysql_config_editor

    mysql_config_editor set --login-path=dev --user=dbuser --host=localhost -p
    

    输入密码然后就可以这样登录了

    mysql --login-path=dev
    

    【讨论】:

      【解决方案3】:

      您应该为此使用mysql_config_editor

      $ mysql_config_editor set \
          --login-path=name_of_connection \
          --host=server.example.com \
          --user=login_as_user \
          --password
      

      这将提示输入密码,并保存到您的主目录中的 .mylogin.cnf 文件中。

      mysql --login-path=name_of_connection dbname 将连接到dbname 上的server.example.comlogin_as_user

      如果--login-path 与其他选项一起使用,例如。 --silent, --login-path 必须是第一个参数/选项

      【讨论】:

        【解决方案4】:

        终于这条线工作了:

         mysql --user=root --password="$(cat /root/.mysql)"
        

        或:

        mysql --user=root --password="$(< /root/.mysql)"
        

        root 密码必须不带引号:bla bla bla

        如果您的密码不包含您可以使用的空格:

        mysql --user=root --password=`cat /root/.mysql`
        

        【讨论】:

        • 这不会阻止密码在进程 cmd 行参数中暴露... -_-
        • 这不再起作用了。 @ThorSummoner 上面提供的这个答案是正确的 - stackoverflow.com/a/48939118/116524
        【解决方案5】:

        试试:

        if [ $MYSQL_PASS ]
        then
          mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"
        else
          mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
        fi
        

        【讨论】:

          【解决方案6】:

          我不确定这是否可能,但您绝对可以使用配置 file.

          【讨论】:

            猜你喜欢
            • 2022-08-04
            • 2018-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-02
            • 1970-01-01
            相关资源
            最近更新 更多