使用Bash Script输出邮件

时间:2016-02-13 17:48:22

标签: linux bash email for-loop ssh

使用我生成的SSH密钥从主机A SSH到几个主机(现在只有下面列出的一个),然后转到特定文件,grep查找具有昨天日期的特定单词..然后我想发送电子邮件这个输出给了我自己。

它正在发送电子邮件,但是它给我的命令而不是命令的输出。

#!/bin/bash

HOST="XXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXX"

DATE=$(date -d "yesterday")

INVALID=' cat /xxx/xxx/xxxxx | grep 'WORD' | sed 's/$/.\n/g' | grep "$DATE"'

COUNT=$(echo "$INVALID" | wc -c)

for x in $HOSTS

do
ssh BLA@"$x" $COUNT

if [ "$COUNT" -gt 1 ];
then

    EMAILTEXT=""
        if [ "$COUNT" -gt 1 ];
        then
                EMAILTEXT="$INVALID"
        fi
fi

done | echo -e "$EMAILTEXT" | mail XXXXXXXXXXX.com

2 个答案:

答案 0 :(得分:1)

这不是试图回答您的问题,但我认为您应该了解代码的一些基本问题。

INVALID=' cat /xxx/xxx/xxxxx | grep 'WORD' | sed 's/$/.\n/g' | grep "$DATE"'

这为变量INVALID指定了一个简单的字符串。由于引用问题,s/$/.\n/g根本没有被引用,并且可能会被shell破坏。 (你不能嵌套单引号 - 第一个单引号字符串从第一个引号延伸到下一个引号,然后WORD在任何引号之外,后跟下一个单引号字符串等。)< / p>

如果您的目的是此时将其作为命令执行,那么您正在寻找命令替换;多层uselessness剥落,可能就像

INVALID=$(sed -n -e '/WORD/!d' -e "/$DATE/s/$/./p" /xxx/xxx/xxxx)

查找匹配WORD$DATE的行,然后在末尾添加一个点来打印匹配 - 我相信您的代码归结为什么,但没有进一步说明深入了解这段代码应该做什么,无法判断这是否是您真正需要的。

COUNT=$(echo "$INVALID" | wc -c)

这会为$COUNT指定一个数字。使用静态定义INVALID,数字将始终为62;但我想这并不是你想要的。

for x in $HOSTS    
do
  ssh BLA@"$x" $COUNT

这会尝试在多个远程主机上执行该数字作为命令(除了循环超过HOSTS且包含主机的变量仅命名为HOST)。这不可能有用,除非你有一组命令为自然数的命令,这些命令在这些远程主机上做了一些有用的事情;但我认为可以安全地假设这不应该发生在这里(如果是的话,绝对有必要在你的问题中解释这一点)。

  if [ "$COUNT" -gt 1 ];
  then

    EMAILTEXT=""
        if [ "$COUNT" -gt 1 ];
        then
                EMAILTEXT="$INVALID"
        fi
  fi

所以EMAILTEXT是空字符串或INVALID的值。您将其指定为上面的静态字符串,这可能是您当前问题的来源。但即使它以某种方式分配给本地主机上的命令,为什么还需要访问远程主机并在那里执行某些操作?或者你的意图是在每个远程主机上执行命令并获得输出吗?

done | echo -e "$EMAILTEXT" | mail XXXXXXXXXXX.com

管道输入echo毫无意义,因为它没有读取其标准输入。你可能应该在done之后有一个换行符;虽然一个可能更有用的安排是让你的循环产生输出,然后我们输出到mail

纯粹是推测性地,或许类似以下内容就是你真正想要的。

for host in $HOSTS; do
    ssh BLA@"$host" sed -n -e '/WORD/!d' -e "/$DATE/s/$/./p" /xxx/xxx/xxxx |
    grep . || echo INVALID
done | mail XXXXXXXXXXX.com

如果要检查是否存在严格的多行输出(这是-gt 1建议的那样),那么这可能需要更复杂一些。

答案 1 :(得分:0)

您的命令替换无效。你应该read up on how it works,但这里有问题:

COUNT=$(echo "$INVALID" | wc -c)
[...]
ssh BLA@"$x" $COUNT

应该是:

COUNT_CMD="'${INVALID} | wc -c'"
[...]
COUNT=$(ssh BLA@"$x" $COUNT_CMD)

这会将$INVALID的值插入到字符串中,并将整个内容放在单引号中。单引号是ssh调用所必需的,因此管道不会在脚本中进行评估,而是在远程主机上进行评估。 (COUNT已更改为COUNT_CMD,以提高可读性/清晰度。)

修改

我误解了这个问题并纠正了我的答案。