如何从Shell脚本自动登录MySQL?

问题描述 投票:27回答:5

我有一个MySQL服务器,其中的用户输入了密码。我想在shell脚本中执行一些SQL查询,而不用像这样指定密码:

config.sh

MYSQL_ROOT="root"
MYSQL_PASS="password"

mysql.sh

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"

如何在不指定-p-u参数等的情况下简化整个过程以执行SQL查询?

mysql bash shell
5个回答
12
投票

尝试一下:

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

44
投票

编写这些选项的替代方法。

您可以写

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"

将空字符串作为单独的参数传递。不过,您在下面的评论中指出,客户端仍然会要求输入密码。可能会将空参数解释为数据库名称而不是密码。因此,您可以尝试以下方法:

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"

至少在我的系统上,在这种情况下,将MYSQL_PASS设置为""会导致客户端尝试完全连接without任何密码。因此,如果空密码和根本没有密码之间存在区别,那么我不知道在命令行上传递前者的方法。

。my.cnf文件

但是即使有办法,我仍然建议您改用~/.my.cnf文件。命令行中的参数很可能包含在ps -A -ocmd生成的进程列表中,因此其他用户可以看到它们。另一方面,.my.cnf文件只能(并且应该)由您自己(使用chmod 0600 ~/.my.cnf)可读,并且将自动使用。使该文件包含以下行:

[client]
user=root
password=

然后,简单的mysql -e "SHOW DATABASES"就足够了,因为客户端将从该文件中获取其凭据。

请参阅6.1.2.1. End-User Guidelines for Password Security,以了解提供密码的各种方法,以及它们各自的优缺点。有关此4.2.3.3. Using Option Files文件的一般信息,请参见.my.cnf。>


14
投票

按照MvG的建议(在MySQL手册4.2.2 connecting6.1.2.1 security guidelines中建议),您应该使用文件。命令行上的密码可能不安全,因为ps可能会将其显示给其他用户。该文件不必是.my.cnf,可以是临时文件中脚本的临时选项文件:


9
投票

这里有一些bash脚本,您可以使用它来快速获得外壳程序


1
投票

要使用Debian GNU / Linux发行版(如Ubuntu,Xubuntu,Linux Mint,gNewSense等)自动登录MySQL,您可以简单地使用包含有效超级用户凭证的现有文件/etc/mysql/debian.cnf

© www.soinside.com 2019 - 2024. All rights reserved.