我有一个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查询?
尝试一下:
if [ $MYSQL_PASS ]
then
mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
您可以写
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
文件。命令行中的参数很可能包含在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
。>
按照MvG的建议(在MySQL手册4.2.2 connecting和6.1.2.1 security guidelines中建议),您应该使用文件。命令行上的密码可能不安全,因为ps可能会将其显示给其他用户。该文件不必是.my.cnf,可以是临时文件中脚本的临时选项文件:
要使用Debian GNU / Linux发行版(如Ubuntu,Xubuntu,Linux Mint,gNewSense等)自动登录MySQL,您可以简单地使用包含有效超级用户凭证的现有文件/etc/mysql/debian.cnf
。