无需root密码即可连接到MySQL低谷命令行


11

我正在为某些任务构建Bash脚本。这些任务之一是从同一bash脚本中创建MySQL数据库。我现在正在做的是创建两个变量:一个用于存储用户名,另一个用于存储密码。这是我脚本的相关部分:

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用户密码拒绝访问root用户,我在做什么错呢?我需要对PostgreSQL做同样的事情。


做一些调试( - :尝试echo "$MYSQL_PASS"将它传递到前mysql行是否有正确的密码。?
KM。

您可以不使用脚本照常登录吗?
qweet 2012年

4
-h丢失。将密码放在命令行上也不是一个好主意,因为每个调用的人都可以看到它们ps wwaux
尼尔斯2012年

Answers:


23

对于MySQL和PostgreSQL,您都可以在本地配置文件中指定用户名和密码。MySQL的.my.cnf和PostgreSQL的.pgpass。这些文件应位于您的主目录中(即〜/ .my.cnf)。

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

您可以在此处有一个通配符条目,用任何字段替换*******。

PS:切勿在命令行上指定密码!如果您的系统未配置为不显示属于其他用户的进程,则使用ps可以完美地看到这一点。

@thinice:如果要创建真正安全的文件,则应该执行以下操作:

umask 077
touch .my.new.config
umask 022 # or whatever was your default

这样一来,从一开始就将使用安全权限创建文件,并且没有窃听者可以窃取密码。

PostgreSQL仍将拒绝使用权限为0600更高的文件。


1
对于mysql的mysql客户端,您可以使用指向一个特定的配置文件--defaults-extra-file=filename。如果要将其放置在非标准位置,或者只是创建一个临时文件,这可能很有用。怀疑它们是与PostgreSQL类似的选项,但我对此并不熟悉。
Zoredache 2012年

1
出于对快乐的gilmore短裤chmod的热爱0600
Thinice 2012年

@kworr我会AREADY尝试,但我的MySQL不会开始改变在/etc/my.cnf中:(这个参数不知道,因为我会稍后重试。
ReynierPM

不是/etc/my.cnf。更新答案。
kworr 2012年

@kworr我尝试您的解决方案,但根本无法正常工作。该数据库是由空创建的,不会出现在phpMyAdmin或任何其他GUI工具中。我将/etc/my.cnf中的数据目录设置为datadir = / data / var / lib / mysql,并在/ data / var / lib / mysql中将权限设置为0755,并将所有者设置为mysql:mysql,为什么数据库为空?问题出在哪里?
ReynierPM

2
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"

mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1

STATUS=$? 
if [ $STATUS -eq 0 ];
then 
    echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
    echo -e "Database '$DBNAME' already exists"
else
    echo -e "Failed to create database '$DBNAME'"
fi

rm -r /tmp/error1 

这将达到目的,谢谢


2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

如何使用安全密码执行命令行?使用配置编辑器!!!

从mysql 5.6.6开始,您可以将密码存储在配置文件中,然后执行类似这样的cli命令。

mysql --login-path=storedPasswordKey ....

--login-path替换变量...主机,用户和密码。优秀的权利!



1
感谢分享!这种方法只有一个陷阱。参数--login-path必须是调用的第一个参数,否则您将收到“未知变量'login-path = local'”消息。
安德烈·奥古斯托

1
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

确保您如何编写通行证并且它不会逃脱

--defaults-extra-file =是一件好事(tm)(c)



1

在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 */;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.