Linux shell脚本电子邮件格式/条件返工

Linux shell脚本电子邮件格式/条件返工,linux,bash,shell,email,Linux,Bash,Shell,Email,上下文:我在redhat radius服务器上工作,我有一个Shell脚本,每当未经授权的用户试图访问网络时,它都会向我发送一封电子邮件(例如:无效用户:交换机:交换机xxx |端口:xx | Mac地址:XXXXXXXXXXXXXXXXX) 我的脚本如下所示: #!/bin/bash while : do if [ ! -e myFile ] ; then grep Invalid radius.log > myFile mailx -E -s Radius-Invalid

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

我的脚本如下所示:

#!/bin/bash



while :

do

if [ ! -e myFile ] ; then

grep Invalid radius.log > myFile

mailx -E -s Radius-Invalid-User myuser@email.com < myFile

else

comm -23 <(grep Trigger-Word radius.log) myFile| mailx -E -s Radius-Invalid-User myuser@mail.com

grep Trigger-Word radius.log > myFile

fi

sleep 1

done
(
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 myuser@mail.com
所以我必须重新分析它。麻烦就在那里开始了

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

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

  Switch: 

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

  Port-Nr: 

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

  MAC-Address: 

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

#!/bin/bash



while :

do

if [ ! -e myFile ] ; then

grep Invalid radius.log > myFile

mailx -E -s Radius-Invalid-User myuser@email.com < myFile

else

comm -23 <(grep Trigger-Word radius.log) myFile| mailx -E -s Radius-Invalid-User myuser@mail.com

grep Trigger-Word radius.log > myFile

fi

sleep 1

done
(
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 myuser@mail.com
这里的问题是,邮件不再是空的,因此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" myuser@email.com # 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
#!/bin/bash



while :

do

        if [ ! -e RadiusLogInvalidarchive ] ; then

                grep Invalid radius.log > RadiusLogInvalidArchive

                mailx -E -s Radius-Invalid-User myuser@mail.com < RadiusLogInvalidArchive

        else


comm -2 -3 <(grep Invalid radius.log) RadiusLogInvalidArchive > testFile


        if [ -s testFile ] ; then


                awk ' BEGIN {
                print "|-------------------------------------------------Invalid User-----------------------------------------------------|"
                print " "
                print " >> Port-NR <<         >>  Switch <<             >> MAC-Address << "
                print " "}
                {print "                 ", $22, "                   ", $19, "                  ", $11}' testFile | mailx -E -s Radius-Test myuser@mail.com

        fi


grep Invalid radius.log > RadiusLogInvalidArchive

                if [ -f testFile ] ; then

                        rm testFile

                fi
        fi

sleep 1

done
#/bin/bash
而:
做
如果[!-e RadiusLogInvalidarchive];然后
grep无效radius.log>RadiusLogInvalidArchive
mailx-E-s Radius无效用户myuser@mail.com>端口号>交换机>MAC地址