当我尝试在终端内运行MySQL上的以下命令时:

mysql -u $user -p$password -e "statement"

执行按预期工作,但它总是发出一个警告:

警告:在命令行界面上使用密码可能不安全。

但是,我必须使用存储密码的环境变量($password)来执行上面的语句,因为我想从Terminal中在bash脚本中迭代地运行命令,而且我绝对不喜欢等待提示显示并强迫我在一个脚本中输入密码50或100次的想法。我的问题是:

压制警告可行吗?如我所述,该命令可以正常工作,但是当我循环并运行该命令50或100次时,窗口变得非常混乱。 我应该遵守警告信息,不写我的密码在我的脚本?如果是这样的话,那么每次提示时我都必须输入密码吗?

Running man mysql没有帮助,说的只是

——显示警告 在每条语句后显示警告(如果有的话)。此选项适用于交互和批处理模式。

也没有提到如何关闭功能,如果我没有错过什么。

我使用的是OS X 10.9.1 Mavericks,使用的是自制的MySQL 5.6。


当前回答

对于PowerShell (pwsh,而不是bash),这是一个相当土豪的解决方案……我的第一次尝试是在try/catch函数中包装对mysql的调用,但由于PowerShell错误处理中的一些奇怪行为,这是不可行的。

解决方案是重写$ErrorActionPreference,以足够长的时间组合和捕获STDERR和STDOUT,并解析单词ERROR并根据需要重新抛出。我们不能捕获和释放“^mysql.*警告。因为PowerShell将错误作为一个流来处理和引发,所以您必须捕获它以便过滤和重新抛出。:/

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

注意:PowerShell可用于Unix,因此此解决方案是跨平台的。它可以通过一些小的语法修改来适应bash。

警告:有许多边缘情况下,这将不起作用,如非英语错误消息或语句在输出的任何地方返回单词error,但它足以吞下对mysql的基本调用的警告,而不破坏整个脚本。希望其他人觉得这有用。

如果mysql简单地添加一个选项来抑制这个警告就好了。

其他回答

对于PowerShell (pwsh,而不是bash),这是一个相当土豪的解决方案……我的第一次尝试是在try/catch函数中包装对mysql的调用,但由于PowerShell错误处理中的一些奇怪行为,这是不可行的。

解决方案是重写$ErrorActionPreference,以足够长的时间组合和捕获STDERR和STDOUT,并解析单词ERROR并根据需要重新抛出。我们不能捕获和释放“^mysql.*警告。因为PowerShell将错误作为一个流来处理和引发,所以您必须捕获它以便过滤和重新抛出。:/

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

注意:PowerShell可用于Unix,因此此解决方案是跨平台的。它可以通过一些小的语法修改来适应bash。

警告:有许多边缘情况下,这将不起作用,如非英语错误消息或语句在输出的任何地方返回单词error,但它足以吞下对mysql的基本调用的警告,而不破坏整个脚本。希望其他人觉得这有用。

如果mysql简单地添加一个选项来抑制这个警告就好了。

另一个解决方案(例如,来自脚本):

 sed -i'' -e "s/password=.*\$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

这里的-i "选项是为了兼容Mac OS x。标准的UNIX操作系统可以直接使用-i

最简单的方法:

mysql -u root -p YOUR_DATABASE

输入这个,你需要输入你的密码。

注意:是的,没有分号。

您还可以在脚本中运行mysql_config_editor,在指定登录路径时传入密码

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

这将启动一个expect会话,该会话可用于脚本中与提示符交互

请看这篇文章

从https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html