我有一个带有密码的用户的 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"
如何在不指定-p
and-u
参数等的情况下简化整个过程以执行 SQL 查询?
你可以写
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
文件。命令行上的参数可能包含在由 生成的进程列表中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
文件的一般信息
正如 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,以防中断。
试试这个:
if [ $MYSQL_PASS ]
then
mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
它会打开一个外壳,以便您可以手动执行查询。很方便。
#!/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"
要使用 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