带有 exec.Command 的 mysqldump 导致 1045 错误,但在终端上工作正常

Posted

技术标签:

【中文标题】带有 exec.Command 的 mysqldump 导致 1045 错误,但在终端上工作正常【英文标题】:mysqldump with exec.Command results in 1045 error, but works fine from terminal 【发布时间】:2020-03-23 02:34:54 【问题描述】:

cmd 初始化

cmd := exec.Command("mysqldump",
        "--column-statistics=0",
        "--default-character-set=utf8",
        "-P", port,
        "-h", host,
        "-u", username,
        fmt.Sprintf("-p'%s'", password),
        dbname)

我得到的错误文本

mysqldump: [警告] 在命令行界面使用密码 可能不安全。 mysqldump:得到错误:1045:用户访问被拒绝 'user'@'ipaddress'(使用密码:YES)尝试连接时

cmd.String() 输出

/usr/bin/mysqldump --column-statistics=0 --default-character-set=utf8 -P 端口 -h 主机 -u 用户名 -p'password' dbname

当我在同一台机器上的终端中执行 cmd.String() 输出时,一切都按预期工作。 这种行为的原因可能是什么?

【问题讨论】:

【参考方案1】:

您可能有一个匿名用户 ''@'localhost'''@'127.0.0.1'

运行 mysql> SELECT user, host FROM mysql.user; 以查看您在 mySQL 上拥有哪些用户。

Documentation:

当可能有多个匹配时,服务器必须确定哪一个 他们使用。它解决了这个问题如下:(...)

当客户端尝试连接时,服务器会查看行 [表 mysql.user] 按排序顺序。服务器使用第一行 匹配客户端主机名和用户名。 (...) 服务器使用 使用最具体的 Host 值对行进行排序的排序规则 第一的。文字主机名 [例如 'localhost'] 和 IP 地址是 最具体的。

注意:空字符串在 MySQL 的身份验证算法中充当通配符

【讨论】:

您应该在发布问题之前查找有此问题的其他人,只是说... 有匿名用户,但我连接到不在本地主机上的数据库。用户表中我的用户的主机条目看起来像 1.1.%。我连接的服务器的 ip 看起来像 1.1.2.3。所以应该有一个匹配

以上是关于带有 exec.Command 的 mysqldump 导致 1045 错误,但在终端上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

如何与 Runtime.getRuntime().exec(command) 程序进行交互?

防止 Ctrl+C 中断 Golang 中的 exec.Command

exec.Command错误,没有输出到stdout或stderr

在 Golang 中运行 exec.Command 时如何调试“退出状态 1”错误

使用 io.Pipe 从 exec.command 获取输出以进行 http post

如何在Golang中运行exec.Command时调试“exit status 1”错误