rootパスワードを必要とせずにMySQLトラフコマンドラインに接続する


11

いくつかのタスクのBashスクリプトを作成しています。これらのタスクの1つは、同じbashスクリプト内からMySQL DBを作成することです。私が今やっていることは、2つの変数を作成することです。1つはストアユーザー名用で、もう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

しかし、パスワードなしでユーザーrootのアクセスが拒否されたことを示すエラーが常に表示されます。PostgreSQLでも同じことをする必要があります。


試してください: -いくつかの(デバッグを行うecho "$MYSQL_PASS"あなたにそれを渡す前に、mysqlラインそれが正しいパスワードを持っています。?
KM。

スクリプトなしで通常どおりログインできますか?
qweet

4
-hが欠落しています。また、コマンドラインにパスワードを配置することはお勧めできません。パスワードはを呼び出すすべてのユーザーに表示されるためですps wwaux
ニルス

回答:


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と同様のオプションであると思われますが、私はそれに精通していません。
ゾレダチェ

1
幸せなギルモアのショートパンツの愛のためにそのファイルをchmod0600
thinice

@kworr私はareadyそれを試してみますが、私のMySQLの原因を知りませんでした:(な/etc/my.cnfでこのパラメータを変更する起動しません。私は後で再試行します。
ReynierPM

/etc/my.cnfではありません。回答を更新しています。
kworr

@kworrソリューションを試してみましたが、まったく機能しません。DBは空で作成され、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
共有してくれてありがとう!このアプローチの落とし穴は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)



0

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 */;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.