我有一个空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文件.命令行上的参数可能包含在生成的进程列表中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文件的一般信息
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)
它打开了一个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)