web-dev-qa-db-ja.com

ターミナル内からmysqlを使用して警告メッセージを抑制しますが、パスワードはbashスクリプトで書き込まれます。

ターミナル内からMySQLで次のコマンドを実行しようとしました。

mysql -u $user -p$password -e "statement"

実行は期待どおりに機能しますが、常に警告が発行されます。

警告:コマンドラインインターフェースでパスワードを使用するのは安全ではありません。

ただし、ターミナル内からbashスクリプトでコマンドを繰り返し実行したいので、パスワードを格納する環境変数($password)を使用して上記のステートメントを実行する必要があります。 1回のスクリプトでパスワードを50回または100回入力するように強制します。だからここに私の質問です:

  • 警告を抑制することは可能ですか?私が言ったようにコマンドはきちんとはたらきます、しかし、私がループして、50回または100回コマンドを実行するとき、ウィンドウはかなり汚くなります。

  • 警告メッセージに従い、スクリプトに自分のパスワードを書き込まないでください。その場合は、プロンプトで要求されるたびにパスワードを入力する必要がありますか。

man mysqlを実行しても役に立ちません。

--show-warnings
各ステートメントの後に警告が表示されるようにします。このオプションはインタラクティブモードとバッチモードに適用されます。

私が何かを見逃していないのであれば、機能を無効にする方法については何も言及していません。

私はOS X 10.9.1 Mavericksを使っていて、自作のMySQL 5.6を使っています。

222
Blaszard

MySQLクライアント/サーバーのバージョンが5.6.xの場合、警告メッセージを回避するにはmysql_config_editortoolsを使用します。

mysql_config_editor set --login-path=local --Host=localhost --user=username --password

その後、あなたのシェルスクリプトで使用することができます:

mysql --login-path=local  -e "statement"

の代わりに:

mysql -u username -p pass -e "statement"
213
Cristian Porta

私はのようなものを使います:

mysql --defaults-extra-file=/path/to/config.cnf

または

mysqldump --defaults-extra-file=/path/to/config.cnf 

Config.cnfの内容は次のとおりです。

[client]
user = whatever
password = whatever
Host = whatever

これにより、異なるサーバー/ロール/データベース用に複数の設定ファイルを持つことができます。 〜/ .my.cnfを使用しても、1セットの設定しかできません(ただし、便利なデフォルトセットになるかもしれません)。

Debianベースのディストリビューションを使用していて、rootとして実行している場合は、上記をスキップして/etc/mysql/debian.cnfを使用するだけで済みます。

mysql --defaults-extra-file=/etc/mysql/debian.cnf

180
David Goodwin

便利な(しかし同じくらい安全ではない)方法の1つは、以下を使用することです。

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

公式文書はそれに対して推奨していることに注意してください。
6.1.2.1パスワードセキュリティのためのエンドユーザガイドライン(Mysql Manual for Version 5.6) :を参照してください。

パスワードをMYSQL_PWD環境変数に保存する

MySQLのパスワードを指定するこの方法は、非常に安全ではないと見なされる必要があり、使用しないでください。 ps の一部のバージョンには、実行中のプロセスの環境を表示するためのオプションが含まれています。システムによっては、MYSQL_PWDを設定すると、パスワードは ps を実行する他のユーザーに公開されます。そのようなバージョンの ps がないシステムでも、ユーザーがプロセス環境を調べることができる他の方法がないと仮定するのは賢明ではありません。

164
Ivan Dokov

コマンドラインでパスワードを使用したい場合は、特定のエラーメッセージを除外するためにこれが機能することがわかりました。

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

それは基本的に標準エラーを標準出力にリダイレクトします - そして "Warning:using a password"にマッチする全ての行を落とすためにgrepを使います。

このようにして、エラーを含む他の出力を見ることができます。私はさまざまなシェルスクリプトなどにこれを使います。

55
johnmontfx

これが、毎日のmysqldumpデータベースバックアップ用のbashスクリプトをより安全に機能させるための方法です。これはクリスチャンポルタのすばらしい答えの拡大です。

  1. 最初に mysql_config_editor (mysql 5.6以降に付属)を使用して暗号化パスワードファイルを設定します。ユーザー名が "db_user"であるとします。シェルプロンプトから実行する

    mysql_config_editor set --login-path=local --Host=localhost --user=db_user --password
    

    パスワードの入力を求められます。入力すると、ユーザー/パスはあなたのhome/system_username/.mylogin.cnfに暗号化されて保存されます。

    もちろん、 "system_username"をサーバー上のユーザー名に変更してください。

  2. あなたのbashスクリプトを以下から変更してください。

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
    

    これに:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
    

これ以上公開されたパスワードはありません。

39
Buttle Butkus

最も簡単な方法は

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
11
JavaGuy

スクリプトでmysql_config_editorを実行して、ログインパスを指定するときにパスワードを渡すこともできます。

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --Host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"

これにより、スクリプトでプロンプトと対話するために使用できるexpectセッションが開始されます。

この記事を見てください

9
phylanx

https://Gist.github.com/nestoru/4f684f206c399894952d から

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "Host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html
4
Nestor Urquiza
Shell> mysql_config_editor set --login-path=local
     --Host=localhost --user=localuser --password
Enter password: enter password "localpass" here
Shell> mysql_config_editor set --login-path=remote
     --Host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here

Mysql_config_editorが.mylogin.cnfファイルに書き込んだ内容を確認するには、printコマンドを使用します。

Shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
Host = localhost
[remote]
user = remoteuser
password = *****
Host = remote.example.com

Printコマンドは、各ログインパスを、ログインパス名を示すグループヘッダーで始まる角括弧で始まり、その後にログインパスのオプション値が続く行のセットとして表示します。パスワード値はマスクされており、クリアテキストとしては表示されません。

前の例で示したように、.mylogin.cnfファイルには複数のログインパスを含めることができます。このように、mysql_config_editorは、異なるMySQLサーバーに接続するための複数の「パーソナリティ」を簡単に設定することを可能にします。これらのいずれも、後でクライアントプログラムを呼び出すときに--login-pathオプションを使用して名前で選択できます。たとえば、ローカルサーバーに接続するには、次のコマンドを使用します。

Shell> mysql --login-path=local

リモートサーバーに接続するには、次のコマンドを使用します。

Shell> mysql --login-path=remote
4
Beta

単純な仕事用のスクリプト。これに "mysql"という名前を付け、 "/ usr/bin"の前のパスに入れます。他のコマンドの明らかな変種、または警告テキストが異なる場合。

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "$@"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1
2
David G.

もう1つの方法は、sshpassを使用してmysqlを起動することです。

sshpass -p topsecret mysql -u root -p username -e 'statement'
2
lewiz

スクリプト/ bin/shにDocker用のソリューションがあります。

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user = root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "パスワード= $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump - デフォルトエクストラファイル=/root/mysql-credentials.cnf --all-databases'

[MYSQL_CONTAINER_NAME]を置き換えて、環境変数MYSQL_ROOT_PASSWORDがコンテナに設定されていることを確認してください。

それは私を助けることができるようにそれがあなたを助けることを願っています!

2

標準エラーのSTDERR出力を/ dev/nullにリダイレクトすることもできます。

だからちょうどしてください:

mysql -u $user -p$password -e "statement" 2> /dev/null

1
Joseph Shih

個人的には、私はそのエラーを捕らえるためにスクリプトラッパーを使います。これがコードサンプルです。

#!/bin/bash

#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err

# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE

# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE

# Handle an error
if [ "" != "$ERROR" ]; then

        # Error occured
        if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
                echo $ERROR >&2
                exit 1
        fi
fi
0
And

最良の解決策はエイリアスを使用することです:

alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

たとえば、これをスクリプトに追加します。

alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"

その後、後でスクリプトでデータベースをロードします。

drupal-mysql database_name < database_dump.sql

ステートメントを実行するには:

drupal-mysql -e "EXEC SOMESTATEMENT;"
0
user356540

PowerShell(pwshname__ではなく、bashname__)の場合、これは非常に無価値なソリューションでした...私の最初の試みは、try/catch関数でmysqlname__への呼び出しをラップすることでしたが、いくつかの PowerShellエラー処理 、これは実行可能ではありませんでした。

解決策は、$ErrorActionPreferenceをオーバーライドして、STDERRname__とSTDOUTname__を組み合わせてキャプチャし、WordのERRORname__を解析し、必要に応じて再スローすることです。 "^mysql.*Warning.*password"でキャッチしてリリースできなかった理由は、PowerShellがエラーを1つのストリームとして処理して発生させるため、すべてをキャプチャする必要があるためですフィルタリングして再スローするため。 :/

Function CallMySQL() {
    # Cache the error action preference
    $_temp = $ErrorActionPreference
    $ErrorActionPreference = "Continue"

    # Capture all output from mysql
    $output = (&mysql --user=foo --password=bar 2>&1)

    # Restore the error action preference
    $ErrorActionPreference = $_temp

    if ($output -match "ERROR") {
        throw $output
    } elseif($output) {
        "   Swallowing $output"
    } else {
        "   No output"
    }
}

注:PowerShellはUnixで使用できるため、このソリューションはクロスプラットフォームです。いくつかのマイナーな構文変更で、bashname__に適合させることができます。

警告:英語以外のエラーメッセージや、WordのERRORname__を返すステートメントなど、これが機能しないエッジケースが多数あります。出力されますが、スクリプト全体を爆破せずにmysqlname__の基本的な呼び出しの警告を飲み込むだけで十分です。うまくいけば、他の人がこれが役に立つと思う。

mysqlname__がこの警告を抑制するオプションを単に追加した場合、それは素晴らしいでしょう。

0
tresf