web-dev-qa-db-ja.com

シェルスクリプトでmysqlに自動ログインする方法は?

空のルートパスワードを持つmysqlサーバーがあります。次のようにパスワードを指定せずに、シェルスクリプトでいくつかのsqlステートメントを実行します。

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS=""

mysql.sh

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"

-pオプションと空のパスワードを使用してシェルでそのSQLを自動実行するにはどうすればよいですか?

26
KeepZero

これを試して:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
12
Diego Basch

これらのオプションを記述する別の方法。

あなたは書ける

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"

空の文字列を個別の引数として渡す。ただし、以下のコメントは、クライアントが引き続きパスワードを要求することを示しています。おそらく、空の引数をパスワードではなくデータベース名として解釈します。そのため、代わりに以下を試すことができます。

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"

ただし、少なくとも私のシステムでは、この場合MYSQL_PASSto ""を設定すると、クライアントはwithoutにパスワードを接続しようとします。すべて。したがって、空のパスワードとパスワードがまったくない場合に違いがある場合、コマンドラインで前者を渡す方法がわかりません。

.my.cnfファイル

ただし、方法があったとしても、代わりに~/.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ファイルの一般情報については、オプションファイルの使用

43
MvG

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"

最初の行は安全な一時ファイルを作成し、オプションを追加して使用します。 trapは、割り込みが発生した場合にOPTFILEが形成されるのを防ぎます。

14
marco

シェルをすばやく取得するために使用できる小さなbashスクリプトを次に示します。

シェルが開き、クエリを手動で実行できます。とても便利。

  #!/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"
9
med116

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'
1
Valerio Bozz