30

パスワードを持つユーザーがいるMySQLサーバーがあります。次のようにパスワードを指定せずに、シェル スクリプトでいくつかの 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-u引数などを指定せずに SQL クエリを実行するために、プロセス全体を単純化するにはどうすればよいですか?

4

5 に答える 5

56

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

あなたは書ける

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

--password=[password is] を指定する場合、または-pとそれに続くパスワードの間にスペースを入れてはなりません。パスワード オプションが指定されていない場合、デフォルトではパスワードは送信されません。

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

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

.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このファイルに関する一般的な情報については、オプション ファイルを使用してください

于 2012-12-11T05:55:09.717 に答える
16

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 が横たわっている状態から保護します。

于 2014-10-31T17:35:50.660 に答える
15

これを試して:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
于 2012-12-11T06:00:27.010 に答える