微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux-Shell脚本电子邮件格式/条件重做

上下文:我在Redhat Radius服务器上工作,我有一个Shell脚本,每次未经授权的用户尝试访问网络时,该脚本都会向我发送一封电子邮件(例如:无效的用户:交换机:交换机xxx |端口:xx | Mac地址:xxxxxxxxxxxxxx )

我的脚本如下所示:

#!/bin/bash



while :

do

if [ ! -e myFile ] ; then

grep Invalid radius.log > myFile

mailx -E -s Radius-Invalid-User [email protected] < myFile

else

comm -23 <(grep Trigger-Word radius.log) myFile| mailx -E -s Radius-Invalid-User [email protected]

grep Trigger-Word radius.log > myFile

fi

sleep 1

done

该脚本可以正常工作,并且完全可以完成它的工作,但是邮件中的Output只是日志文件中的一行,很难读取:

Mon Jan 22 09:38:24 2018 : Auth: (18) Invalid user: [000000000] (from client client-id port 15 cli xx-xx-xx-xx-xx-xx) switchname Port: |15|

所以我必须进行修复.麻烦开始了.

我尝试对其进行重做,以便邮件输出为:

|-------------------------------------------------------------|

  Switch: 

|-------------------------------------------------------------|

  Port-Nr: 

|-------------------------------------------------------------|

  MAC-Address: 

|-------------------------------------------------------------|

我认为脚本部分应如下所示:

(
echo "|-------------------------------------------------------------|"
echo " "
echo "  Switch: `awk 'END {print $19}' myFile`"
echo " "
echo "|-------------------------------------------------------------|"
echo " "
echo "  Port-Nr: `awk 'END {print $21}' myFile`"
echo " "
echo "|-------------------------------------------------------------|"
echo " "
echo "  MAC-Address: `awk 'END {print $11}' myFile`"
echo " "
echo "|-------------------------------------------------------------|"
) | mailx -E -s Radius [email protected]

这里的问题是,该邮件不再为空,因此mailx命令中的-E不能帮助它不再检查是否已发送此邮件.因为这是一个无休止的循环,所以它以“空白表格”发送永久邮件.

有人可以帮我解决该脚本的功能与第一个脚本完全相同的问题,但是可以使用正确的格式发送邮件.

如果您需要更多信息,请告诉我
提前谢谢

解决方法:

#!/bin/bash

l=radius.log                                            # logfile, all logs
m=myFile

_sendMail(){                                            # send mail if not empty
  local f msg="$(</dev/stdin)"                          # mail contents
  if [[ -n "$msg" ]]; then                              # if contents not empty
    while read -r -a f || [[ -n "${f[20]}" ]]; do       # read line by line
      [[ -z "${f[20]}" ]] && continue                   # ignore mal-formatted log
      echo "|-------------------------------------------------------------|"
      echo "  Switch: ${f[18]}"
      echo "|-------------------------------------------------------------|"
      echo "  Port-Nr: ${f[20]}"
      echo "|-------------------------------------------------------------|"
      echo "  MAC-Address: ${f[10]}"
      echo "|-------------------------------------------------------------|"
    done <<<"$msg" | (echo "-----> $1"; cat)            # fake sending for test
    #done <<<"$msg" | mailx -E -s "$1" [email protected] # real sending, $1 = subject
  fi
}

while :; do                                             # endless loop
  if [[ ! -e "$m" ]]; then
    grep "Invalid user" "$l" >"$m"
    _sendMail "Invalid $l" <"$m"
  else
    n=$(grep "Invalid user" "$l")
    comm -23 <(echo "$n") "$m" | _sendMail "Radius Invalid User"
    echo "$n" >"$m"
  fi
  sleep 1
done

去测试:

>运行bash脚本
>在另一个终端上,将日志行连续添加到radius.log中,例如:

$echo’Auth:(18)无效的用户:[000000000](来自客户端client-id端口15 cli xx-xx-xx-xx-xx-xx)switchname端口:| 15 |’ >> radius.log
> bash脚本检测到新日志,如果该日志行包含“ Invalid user:”,则发送邮件.

输出

$./report-error.sh 
-----> Radius Invalid User
|-------------------------------------------------------------|
  Switch: switchname
|-------------------------------------------------------------|
  Port-Nr: |23|
|-------------------------------------------------------------|
  MAC-Address: [000000000]
|-------------------------------------------------------------|
-----> Radius Invalid User
|-------------------------------------------------------------|
  Switch: switchname
|-------------------------------------------------------------|
  Port-Nr: |33|
|-------------------------------------------------------------|
  MAC-Address: [000000000]
|-------------------------------------------------------------|
-----> Radius Invalid User
|-------------------------------------------------------------|
  Switch: switchname
|-------------------------------------------------------------|
  Port-Nr: |33|
|-------------------------------------------------------------|
  MAC-Address: [000000000]
|-------------------------------------------------------------|
|-------------------------------------------------------------|
  Switch: switchname
|-------------------------------------------------------------|
  Port-Nr: |33|
|-------------------------------------------------------------|
  MAC-Address: [000000000]
|-------------------------------------------------------------|

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐