ターミナル内から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を使っています。
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"
私はのようなものを使います:
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
便利な(しかし同じくらい安全ではない)方法の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 がないシステムでも、ユーザーがプロセス環境を調べることができる他の方法がないと仮定するのは賢明ではありません。
コマンドラインでパスワードを使用したい場合は、特定のエラーメッセージを除外するためにこれが機能することがわかりました。
mysqlcommand 2>&1 | grep -v "Warning: Using a password"
それは基本的に標準エラーを標準出力にリダイレクトします - そして "Warning:using a password"にマッチする全ての行を落とすためにgrepを使います。
このようにして、エラーを含む他の出力を見ることができます。私はさまざまなシェルスクリプトなどにこれを使います。
これが、毎日のmysqldumpデータベースバックアップ用のbashスクリプトをより安全に機能させるための方法です。これはクリスチャンポルタのすばらしい答えの拡大です。
最初に 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"をサーバー上のユーザー名に変更してください。
あなたのbashスクリプトを以下から変更してください。
mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
これに:
mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
これ以上公開されたパスワードはありません。
最も簡単な方法は
mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
スクリプトで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セッションが開始されます。
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
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
単純な仕事用のスクリプト。これに "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
もう1つの方法は、sshpassを使用してmysqlを起動することです。
sshpass -p topsecret mysql -u root -p username -e 'statement'
スクリプト/ 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がコンテナに設定されていることを確認してください。
それは私を助けることができるようにそれがあなたを助けることを願っています!
標準エラーのSTDERR出力を/ dev/nullにリダイレクトすることもできます。
だからちょうどしてください:
mysql -u $user -p$password -e "statement" 2> /dev/null
個人的には、私はそのエラーを捕らえるためにスクリプトラッパーを使います。これがコードサンプルです。
#!/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
最良の解決策はエイリアスを使用することです:
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;"
PowerShell(pwsh
name__ではなく、bash
name__)の場合、これは非常に無価値なソリューションでした...私の最初の試みは、try/catch
関数でmysql
name__への呼び出しをラップすることでしたが、いくつかの PowerShellエラー処理 、これは実行可能ではありませんでした。
解決策は、$ErrorActionPreference
をオーバーライドして、STDERR
name__とSTDOUT
name__を組み合わせてキャプチャし、WordのERROR
name__を解析し、必要に応じて再スローすることです。 "^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で使用できるため、このソリューションはクロスプラットフォームです。いくつかのマイナーな構文変更で、bash
name__に適合させることができます。
警告:英語以外のエラーメッセージや、WordのERROR
name__を返すステートメントなど、これが機能しないエッジケースが多数あります。出力されますが、スクリプト全体を爆破せずにmysql
name__の基本的な呼び出しの警告を飲み込むだけで十分です。うまくいけば、他の人がこれが役に立つと思う。
mysql
name__がこの警告を抑制するオプションを単に追加した場合、それは素晴らしいでしょう。