Loại bỏ các thông báo cảnh báo từ MySQL trong shell script nhưng cho phép lỗi


10

Các tệp nhật ký của tôi đang bị xóa với thông báo sau trong khi chạy các kịch bản shell bằng cách sử dụng một số lệnh MySQL cơ bản.

Đây là thông điệp:

"Cảnh báo: Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn."

Để dừng những tin nhắn này, tôi đang sử dụng định nghĩa công việc sau đây.

Thí dụ:

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

Điều này đã làm việc nhưng các lỗi MySQL không được đăng nhập output.log.

Nếu tôi thay đổi định nghĩa như sau, thì lỗi MySQL bắt đầu xuất hiện nếu có

run_wrapper.sh > output.log 2>&1

Vì vậy, câu hỏi là làm thế nào để ngăn chặn các thông báo cảnh báo và cũng báo cáo lỗi SQL trong các tệp nhật ký chỉ sử dụng định nghĩa cron?


có lẽ bạn nên sử dụngrun_wrapper.sh >> output.log 2>&1
Rahul

1
Tôi không theo dõi. Bạn muốn lỗi / cảnh báo đi đâu và bạn muốn đầu ra đi đâu, và bạn muốn vứt bỏ cái gì? Điều gì đang tạo ra cảnh báo mật khẩu và tại sao bạn có lỗi trong MySQL mà bạn không muốn sửa?
Kusalananda

1
mysql in cảnh báo khi bạn sử dụng -ptùy chọn trên dòng lệnh. Thay vì sửa nó (ví dụ: bằng cách tạo một ~/.my.cnf600 perm), OP muốn bỏ qua và loại bỏ cảnh báo (và chỉ cảnh báo đó, không phải tất cả các stderr)
cas

Câu trả lời:


25

Trong tập lệnh bash của bạn, chỉnh sửa nó ở trên cùng

export MYSQL_PWD=yourdbpassword

và truy vấn mysql như: mysql -u username -h host db -e "statement"

Tham khảo: Từ câu trả lời được đăng tại Stackoverflow . Các câu trả lời khác cũng có thể được theo sau.


2

tìm kiếm một dòng trong trình bao bọc của bạn tương tự như

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

và đổi thành

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

Điều này giải quyết nguồn cảnh báo.


Điều này có ý nghĩa :-) Thx!
Mike Q

1

Có vẻ như bạn đang thiếu chuyển hướng stderr từ run_wrapper.shchính nó, vì vậy các lỗi không xảy ra grepvà từ đó đến tệp nhật ký.

Thay vào đó, hãy thử điều này nếu bạn hài lòng khi có cả stdoutsdterr được ghi vào logfile của bạn

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

Hoặc nếu bạn chỉ muốn các lỗi được ghi vào logfile và stdout còn lại ghi vào thiết bị đầu cuối cuộc gọi, hãy thử điều này

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

0

Thử cái này:

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

Chuyển hướng thiết bị lỗi chuẩn qua Process Thay vào grep -v ...và đầu ra từ đó được nối với >>tớioutput.log

Có thể bạn muốn sử dụng (GNU) grep's --line-bufferedlựa chọn cũng như -vđể làm cho đầu ra chắc chắn lỗi không bị trì hoãn.


Nếu xử lý hậu kỳ, tệp nhật ký là một tùy chọn có thể chấp nhận cho bạn, bạn có thể xóa (các) dòng "Cảnh báo:" không mong muốn khỏi tệp nhật ký sau khi run_wrapper.shkết thúc.

Đoạn script shell sau đây lưu dấu thời gian (in $ts) của tệp nhật ký (in $lf) trước khi chạy sed -ivà khôi phục nó sau đó:

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"

Nếu bạn cần duy trì inode của tệp nhật ký (ví dụ: vì nó có liên kết cứng), hãy sử dụng edthay vì 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"

Cảm ơn vì sự trả lời. Tôi đã thử tùy chọn được đề xuất như dưới đây
jagadish puvvada

tùy chọn sed tạo các dòng trống và chúng tôi cũng cần phải xóa chúng và nó cũng thay đổi dấu thời gian của tệp
jagadish puvvada

Tùy chọn hậu xử lý với sed cũng thay đổi inode cũng như dấu thời gian - điều đó là bình thường đối với -i(và hầu hết các hình thức chỉnh sửa "tại chỗ"). Nếu chạy ngay sau đó, nó chỉ nên khác nhau vài giây hoặc giây, tùy thuộc vào kích thước logfile của khóa học. Nhưng không có cách nào một lệnh d(xóa dòng) sedsẽ tạo ra một dòng trống - chính xác thì ý của bạn là gì?
cas

sedTùy chọn @jagadishpuvvada hiện lưu và khôi phục dấu thời gian của output.log.
cas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.