30

我有一个带有密码的用户的 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"

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

4

5 回答 5

56

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

你可以写

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

--password=如果给出 [password is],则or-p和其后的密码之间不能有空格。如果未指定密码选项,则默认为不发送密码。

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

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

.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。密码安全的最终用户指南,了解您可以提供密码的各种方式,以及它们各自的优缺点。见4.2.3.3。使用选项文件获取有关此.my.cnf文件的一般信息

于 2012-12-11T05:55:09.717 回答
16

正如 MvG 所建议的(在 MySQL 手册4.2.2 连接6.1.2.1 安全指南中推荐),您应该使用文件。命令行上的密码可能不安全,因为 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,以防中断。

于 2014-10-31T17:35:50.660 回答
15

试试这个:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
于 2012-12-11T06:00:27.010 回答
11

这是一个小 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"
于 2014-01-21T01:10:20.333 回答
1

要使用 Debian GNU/Linux 发行版(如 Ubuntu、Xubuntu、Linux Mint、gNewSense 等)自动登录 MySQL,您只需使用/etc/mysql/debian.cnf包含有效超级用户凭据的现有文件即可。

因此,您可以尝试使用以下简单命令自动登录:

sudo mysql --defaults-file=/etc/mysql/debian.cnf

如果可行,为避免记住上述命令,您还可以创建一些 Bash 别名。您可以在用户终端中粘贴这些命令:

echo ''                                                                       >> ~/.bashrc
echo "# Auto-login in MySQL"                                                  >> ~/.bashrc
echo "# From https://stackoverflow.com/a/33584904/3451846"                    >> ~/.bashrc
echo "alias mysql='sudo mysql --defaults-file=/etc/mysql/debian.cnf'"         >> ~/.bashrc
echo "alias mysqldump='sudo mysqldump --defaults-file=/etc/mysql/debian.cnf'" >> ~/.bashrc
. ~/.bashrc

然后只需键入以下内容即可自动登录:

mysql
于 2015-11-07T16:19:38.493 回答