Menekan pesan peringatan dari MySQL di skrip shell tetapi mengizinkan kesalahan

10

File log saya akan dibuang dengan pesan berikut saat menjalankan skrip shell menggunakan beberapa perintah MySQL yang mendasarinya.

Ini pesannya:

"Peringatan: Menggunakan kata sandi pada antarmuka baris perintah dapat menjadi tidak aman."

Untuk menghentikan pesan-pesan ini, saya menggunakan definisi pekerjaan berikut.

Contoh:

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

Ini berhasil tetapi kesalahan MySQL tidak sedang login output.log.

Jika saya mengubah definisi seperti berikut, maka kesalahan MySQL mulai muncul jika ada

run_wrapper.sh > output.log 2>&1

Jadi pertanyaannya adalah bagaimana cara menekan pesan peringatan dan juga melaporkan kesalahan SQL dalam file log hanya menggunakan definisi cron?

jvvada jagadish
sumber
mungkin Anda harus menggunakanrun_wrapper.sh >> output.log 2>&1
Rahul
1
Saya tidak mengikuti. Di mana Anda ingin kesalahan / peringatan untuk pergi dan ke mana Anda ingin output untuk pergi, dan apa yang ingin Anda buang? Apa yang menghasilkan peringatan kata sandi dan mengapa Anda memiliki kesalahan di MySQL yang tidak ingin Anda perbaiki?
Kusalananda
1
mysql mencetak peringatan itu ketika Anda menggunakan -popsi pada baris perintah. Alih-alih memperbaikinya (misalnya dengan membuat ~/.my.cnfdengan 600 perm) OP ingin mengabaikan dan membuang peringatan (dan hanya peringatan itu, tidak semua stderr)
cas

Jawaban:

25

Di skrip bash Anda, edit di bagian atas

export MYSQL_PWD=yourdbpassword

dan permintaan mysql seperti: mysql -u username -h host db -e "statement"

Referensi: Dari jawaban yang diposting di Stackoverflow . Jawaban lain juga bisa diikuti.

bunga aster
sumber
2

cari baris di pembungkus Anda yang mirip dengan

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

dan ubah ke

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

ini memecahkan sumber peringatan.

Mockler
sumber
Ini masuk akal :-) Terima kasih!
Mike Q
1

Sepertinya Anda melewatkan pengarahan stderr dari run_wrapper.shdirinya sendiri, sehingga kesalahan tidak melalui grepdan kemudian ke file log.

Coba ini sebagai gantinya jika Anda senang memiliki stdout dan sdterr yang ditulis ke file log Anda

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

Atau jika Anda hanya menginginkan kesalahan yang ditulis ke logfile, dan stdout menulis ke terminal panggilan, coba ini

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

Coba ini:

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

Arahkan ulang stderr melalui Substitusi Proses ke grep -v ..., dan output dari yang ditambahkan >>keoutput.log

Anda mungkin ingin menggunakan (GNU) grep's --line-bufferedpilihan serta -vuntuk membuat output memastikan kesalahan tidak tertunda.


Jika post-processing file log adalah pilihan yang dapat diterima untuk Anda, Anda bisa menghapus baris "Peringatan:" yang tidak diinginkan dari file log setelah run_wrapper.shselesai.

Fragmen skrip shell berikut menyimpan stempel waktu (dalam $ts) dari file log (dalam $lf) sebelum dijalankan sed -idan mengembalikannya sesudahnya:

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"

Jika Anda perlu mempertahankan inode file log (misalnya karena memiliki tautan keras), gunakan eddaripada 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"
cas
sumber
Terima kasih atas tanggapannya. Saya telah mencoba opsi yang disarankan seperti di bawah ini
jagadish puvvada
Opsi sed membuat baris kosong dan kita perlu menghapusnya juga dan itu mengubah stempel waktu file juga
jagadish puvvada
Opsi post-process-with-sed juga mengubah inode dan juga stempel waktu - itu normal untuk -i(dan sebagian besar bentuk "in-place" editing "). Jika dijalankan segera setelah itu, seharusnya hanya dalam mikrodetik atau detik yang berbeda, tentu saja tergantung pada ukuran logfile.Tapi tidak mungkin perintah d(delete line) sedakan membuat baris kosong - apa maksud Anda dengan hal itu?
cas
sedOpsi @jagadishpuvvada sekarang menyimpan dan mengembalikan stempel waktu keluaran.log.
cas
0

Coba tambahkan ini ke akhir perintah Anda:

/ dev / null 2> & 1

pengguna236164
sumber