我有一个空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?
答案 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
文件。命令行上的参数可能包含在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 connecting和6.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,因此您可以手动执行查询。非常方便。
#!/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'