我正在为一些任务构建一个 Bash 脚本。其中一个任务是在同一个 Bash 脚本中创建一个 MySQL DB。我现在正在做的是创建两个变量:一个用于存储用户名,另一个用于存储密码。这是我的脚本的相关部分:
MYSQL_USER=root
MYSQL_PASS=mypass_goes_here
touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql
但总是出现错误,提示拒绝 root 用户访问,没有密码,我做错了什么?我需要对 PostgreSQL 做同样的事情。
答案1
对于 MySQL 和 PostgreSQL,您都可以在本地配置文件中指定您的用户和密码。MySQL 为 .my.cnf,PostgreSQL 为 .pgpass。这些文件应位于您的主目录中(即 ~/.my.cnf)。
.my.cnf:
[mysql]
user=user
password=password
.pgpass:
host:port:database:user:password
您可以在此处使用通配符条目,用任何字段替换 *******。
附言:永远不要在命令行上指定密码!这可以完美地显示出来附言如果您的系统未配置为不显示属于其他用户的进程。
@thinice:如果你想要创建真正安全的文件,你应该这样做:
umask 077
touch .my.new.config
umask 022 # or whatever was your default
这样,文件从一开始就会以安全权限创建,窃听者就无法窃取您的密码。
无论如何,PostgreSQL 都会拒绝使用权限高于 0600 的文件。
答案2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password
如何使用安全密码执行命令行?使用配置编辑器!!!
从 mysql 5.6.6 开始,您可以将密码存储在配置文件中,然后执行如下 cli 命令......
mysql --login-path=storedPasswordKey ....
--login-path 替换变量...主机、用户和密码。非常好!
答案3
不要在密码周围加上引号,因为如果这样做,引号将被视为密码的一部分。
答案4
类似问题存在于 StackOverflow 上。
总结我的答案从那里。
你可以export MYSQL_PWD=yourverysecretpassword
。
与使用配置文件相比,此方法的优点在于您不需要单独的配置文件来与脚本保持同步。您只需要维护脚本。
有没有缺点使用此方法。
密码是不是对系统上的其他用户可见(如果在命令行上,它将是可见的)。环境变量仅对运行 mysql 命令的用户和 root 可见。
任何可以读取脚本本身的人都会看到密码,因此请确保脚本本身受到保护。这与保护配置文件没有任何区别。如果您希望脚本公开可读(export MYSQL_PWD=$(cat /root/mysql_password)
例如),您仍然可以从单独的文件中获取密码。导出变量仍然比构建配置文件更容易。
例如,
$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13 Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost Database: mysql
-- ------------------------------------------------------
-- Server version 5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;