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


10

使用某些基本的MySQL命令运行shell脚本时,我的日志文件随以下消息一起转储。

这是消息:

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

要停止这些消息,我正在使用以下作业定义。

例:

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错误?


可能您应该使用run_wrapper.sh >> output.log 2>&1
Rahul

1
我没有关注。您希望将错误/警告发送到哪里,要将输出发送到哪里,以及要丢弃什么?是什么生成了密码警告,为什么您不想修复MySQL中的错误?
库沙兰丹

1
当您-p在命令行上使用该选项时,mysql将显示该警告。~/.my.cnfOP不想解决它(例如,通过创建具有600个权限的pers),而只是忽略并丢弃警告(并且仅警告,而不是全部stderr)
cas

Answers:


25

在您的bash脚本中,在顶部对其进行编辑

export MYSQL_PWD=yourdbpassword

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

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


2

在包装器中搜索类似于

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

并更改为

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

这解决了警告的来源。


这很有意义:-)谢谢!
迈克Q

1

看起来您好像缺少了stderr重定向run_wrapper.sh,因此错误不会通过grepandthence传递到日志文件。

如果您愿意将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

0

尝试这个:

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完成后从日志文件中删除不需要的“警告:”行。

以下shell脚本片段在运行之前保存$ts日志文件的时间戳记(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"

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

感谢您的回复。我已经尝试过如下所示的建议选项
jagadish puvvada

sed选项会创建空白行,我们也需要删除它们,并且它也会更改文件时间戳
jagadish puvvada16年

带有sed的post-process选项还更改了inode和时间戳-这是正常的-i(以及大多数形式的“就地”编辑”)。如果此后立即运行,则应仅相差微秒或几秒,根据课程的日志文件大小,但有没有办法。d在(删除线)命令sed创建一个空行-究竟是什么你的意思?
中科院

@jagadishpuvvada sed选项现在可以保存和恢复output.log的时间戳。
cas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.