如何在shell脚本中自动登录mysql?

时间:2012-12-11 05:50:49

标签: mysql bash shell

我有一个空root密码的mysql服务器。我想在shell脚本中执行一些sql语句而不指定如下的密码:

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS=""

mysql.sh

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

如何使用-p选项和空密码在shell中自动执行该sql?

5 个答案:

答案 0 :(得分:41)

编写这些选项的其他方法。

你可以写

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

将空字符串作为单独的参数传递。您的下面的评论表明客户端仍会要求输入密码。可能它将空参数解释为数据库名称而不是密码。所以你可以尝试以下方法:

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

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

.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了解您提供密码的各种方式,以及各自的优缺点。有关此.my.cnf文件的一般信息,请参阅4.2.3.3. Using Option Files

答案 1 :(得分:14)

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

OPTFILE="$(mktemp -q --tmpdir "${inname}.XXXXXX")$"
trap 'rm -f "$OPTFILE"' EXIT
chmod 0600 "$OPTFILE"
cat >"$OPTFILE" <<EOF
[client]
password="${MYSQL_PASS}"
EOF
mysql --user="$MYSQL_ROOT" --defaults-extra-file="$OPTFILE" -e "SHOW DATABASES"

第一行创建一个安全的临时文件,然后放入选项然后使用它。 如果发生中断,陷阱会保护你的OPTFILE。

答案 2 :(得分:11)

试试这个:

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

答案 3 :(得分:9)

这是一个可以用来快速获取shell的小bash脚本

它打开了一个shell,因此您可以手动执行查询。非常方便。

  #!/bin/bash
  DB_USER='your_db_username'
  DB_PASS='your_password'
  DB='database_name'
  echo 'logging into db $DB as $DB_USER'
  mysql -u "$DB_USER" --password="$DB_PASS" --database="$DB"

答案 4 :(得分:1)

在Debian GNU / Linux发行版中,有一个名为/etc/mysql/debian.cnf的文件。您不必使用MySQL root凭据创建另一个文件。

# Put in your .bashrc
alias mysql='mysql --defaults-file=/etc/mysql/debian.cnf'
alias mysqldump='mysqldump --defaults-file=/etc/mysql/debian.cnf'