在 shell 脚本中禁止来自 MySQL 的警告消息但允许错误

jag*_*ada 14 logs io-redirection shell-script mysql

在使用一些底层 MySQL 命令运行 shell 脚本时,我的日志文件被转储了以下消息。

这是消息:

“警告:在命令行界面上使用密码可能不安全。”

为了停止这些消息,我使用了以下作业定义。

例子:

run_wrapper.sh |grep -v "Warning: Using a password" > output.log 2>&1
Run Code Online (Sandbox Code Playgroud)

这有效,但未将 MySQL 错误记录到output.log.

如果我像下面那样更改定义,那么 MySQL 错误就会开始出现(如果有的话)

run_wrapper.sh > output.log 2>&1
Run Code Online (Sandbox Code Playgroud)

所以问题是如何仅使用 cron 定义来抑制警告消息并报告日志文件中的 SQL 错误?

d a*_*s y 30

在您的 bash 脚本中,在顶部编辑它

export MYSQL_PWD=yourdbpassword
Run Code Online (Sandbox Code Playgroud)

和 mysql 查询,如: mysql -u username -h host db -e "statement"

参考:来自Stackoverflow 上发布的答案。也可以遵循其他答案。


cas*_*cas 0

尝试这个:

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

通过Process Substitution将 stderr 重定向到grep -v ...,并将其输出附加>>output.log

您可能想要使用 (GNU)grep--line-buffered选项并-v确保错误输出不会延迟。


run_wrapper.sh如果对日志文件进行后处理是您可以接受的选项,则可以在完成后从日志文件中删除不需要的“警告:”行。

以下 shell 脚本片段在运行之前保存$ts日志文件 (in ) 的时间戳 (in )并在运行后恢复它:$lfsed -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"
Run Code Online (Sandbox Code Playgroud)

如果您需要保留日志文件的索引节点(例如因为它具有硬链接),请使用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"
Run Code Online (Sandbox Code Playgroud)