web-dev-qa-db-ja.com

シェルスクリプトでMySQLからの警告メッセージを抑制し、エラーを許可する

基礎となるいくつかのMySQLコマンドを使用してシェルスクリプトを実行しているときに、ログファイルが次のメッセージでダンプされます。

ここにメッセージがあります:

「警告:コマンドラインインターフェースでのパスワードの使用は安全でない場合があります。」

これらのメッセージを停止するには、次のジョブ定義を使用しています。

例:

run_wrapper.sh |grep -v "Warning: Using a password" > output.log 2>&1

これは機能しましたが、MySQLエラーはoutput.logに記録されていません。

次のように定義を変更すると、MySQLエラーが表示され始めます

run_wrapper.sh > output.log 2>&1

では、問題は警告メッセージを抑制し、cron定義のみを使用してログファイルにSQLエラーを報告する方法です。

10

Bashスクリプトで、上部で編集します

export MYSQL_PWD=yourdbpassword

とmysqlクエリ:mysql -u username -h Host db -e "statement"

参照:Stackoverflow に投稿された回答から。他の回答もフォローできます。

24
d a i s y

ラッパーで次のような行を検索します

mysql -u<username> -p<some_password> -hlocalhost -D<database_name> 

に変更

export MYSQL_PWD=<some_password> ; mysql -u<username> -hlocalhost -D<database_name> 

これは警告の原因を解決します。

2
Mockler

stderrリダイレクトがrun_wrapper.sh自体から欠落しているようです。そのため、エラーはgrepを通過せず、ログファイルにも記録されません。

stdoutsdterrの両方をログファイルに書き込んでよければ、代わりにこれを試してください

run_wrapper.sh 2>&1 | grep -v "Warning: Using a password" > output.log

または、ログファイルに書き込まれたエラーのみが必要で、stdoutが呼び出し側端末に書き込まれたままになっている場合は、これを試してください

( run_wrapper.sh 2>&1 1>&3 | grep -v "Warning: Using a password" > output.log ) 3>&1
1
roaima

コマンドの最後にこれを追加してみてください:

/ dev/null 2>&1

0
user236164

これを試して:

lf='output.log'
> "$lf"   # first truncate/create the logfile.
run_wrapper.sh >> "$lf" 2> >(grep -v "Warn.*passw.*insec" >> "$lf")

Process Substitution を介してstderrをgrep -v ...にリダイレクトし、その出力に>>を追加してoutput.logに追加します。

(GNU)grep--line-bufferedオプションと-vを使用して、エラー出力が遅延しないようにする必要があります。


ログファイルの後処理が許容できるオプションである場合は、run_wrapper.shの終了後に、不要な "Warning:"行をログファイルから削除できます。

次のシェルスクリプトフラグメントは、$tsを実行する前にログファイル($lf内)のタイムスタンプ(sed -i内)を保存し、後で復元します。

lf='output.log'

run_wrapper.sh >& "$lf"

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
sed -i -e '/Warning: Using a password/d' "$lf"
touch -t "$ts" "$lf"

ログファイルのiノードを保持する必要がある場合(ハードリンクがあるためなど)、edではなくsedを使用します。

ts=$(date -r "$lf" '+%Y%m%d%H%M.%S')
printf "%s\n" 'g/Warning: Using a password/d' w | ed -s "$lf"
touch -t "$ts" "$lf"
0
cas