使用我生成的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
答案 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
,以提高可读性/清晰度。)
修改强>
我误解了这个问题并纠正了我的答案。