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

Kee*_*ero 27 mysql bash shell

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

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS="password"
Run Code Online (Sandbox Code Playgroud)

mysql.sh

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"
Run Code Online (Sandbox Code Playgroud)

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

MvG*_*MvG 47

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

你可以写

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"
Run Code Online (Sandbox Code Playgroud)

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

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"
Run Code Online (Sandbox Code Playgroud)

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

.my.cnf文件

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

[client]
user=root
password=
Run Code Online (Sandbox Code Playgroud)

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

6.1.2.1.密码安全最终用户指南,提供密码的各种方式,以及各自的优点和缺点.见4.2.3.3.使用选项文件获取有关此.my.cnf文件的一般信息

  • `-p`选项后面没有任何空格.它必须看起来像:`-pMyPassHere`或`-p'My Pass Here'. (6认同)
  • 这不应该是公认的答案吗?特别是因为它提供了高度相关的.my.cnf选项? (5认同)

mar*_*rco 14

正如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"
Run Code Online (Sandbox Code Playgroud)

第一行创建一个安全的临时文件,然后放入选项然后使用它.陷阱将保护你在中断的情况下形成OPTFILE.


Die*_*sch 12

试试这个:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
Run Code Online (Sandbox Code Playgroud)

  • 密码不应该被bash或用户插入命令行.这是非常不安全的.-p也是错误的,因为不应该有空格,谢天谢地,因为用户绝对不应该这样做! (5认同)
  • 注意这个答案是错误的,因为在-p选项之后应该没有空格.一般来说,使用默认文件是一种更好的方法(应该只能由用户读取,所以chmod 600):`mysql -u"$ MYSQL_ROOT" - defaultf-file =/tmp/my.cnf -e"显示数据库"` (3认同)

med*_*116 9

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

它打开了一个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"
Run Code Online (Sandbox Code Playgroud)