1 linux autologin email shell-script
我是脚本世界的新手,目前正在使用脚本对我管理的 san 设备执行运行状况检查。
该脚本很简单,并将命令输出重定向到当前文件,从远程设备到我的本地主机。然后我使用 diff 命令来比较当前文件和参考文件的输出,并收到有关差异的电子邮件警报。
但是我目前面临的问题是,每次运行脚本时,都会在脚本执行后收到一封电子邮件,即即使比较没有差异,我也会从脚本执行中收到一封空白电子邮件。
由于这与执行自动健康检查有关,因此每天收到一封空白电子邮件会很麻烦。有什么方法可以调整差异或添加更多代码以确保当差异显示没有差异时,我不应该收到电子邮件,只有在存在差异并显示差异时才收到电子邮件。
### saves output of command switchshow in a file on local host
ssh user@ip_of_switch switchshow > switchshow_results
### Compares current output to reference file and mails the difference
diff switchshow_reference switchshow_results \
| mail -s device_PORT_ERROR email_recipient
Run Code Online (Sandbox Code Playgroud)
如果需要任何其他信息,请告诉我。
感谢您的帮助和详细解释 Slm :)
到目前为止,我已经使电子邮件部分正常工作(只有在与diff命令存在差异时才会收到电子邮件)。然而,我现在收到的电子邮件将其测试连接成一个长字符串,这不利于查看,而且对于将要收到它的人来说也不容易理解。
我当前的脚本粘贴在下面:
ssh test@ip_of_device switchshow > switchshow_results
variable=`diff switchshow_reference switchshow_results`
if [[ $variable -eq 0 ]]
then
echo $"nothing"
else
echo $variable | mail -s switch_HARDWARE_CHECK recipeint_email_address
fi
Run Code Online (Sandbox Code Playgroud)
上面脚本的输出是空白的,当diff命令没有发现任何区别时,我没有收到任何电子邮件。但是,当diff命令发现差异时,我会收到一封粘贴如下的电子邮件:
16c16 < 0 0 010000 id N4 Online FC F-Port 1 N Port + 1 NPIV public --- > 0 0 010000 id N4 No_Light FC F-Port 1 N Port + 1 NPIV public 26c26 < 10 10 010a00 id N4 Online FC F-Port 1 N Port + 1 NPIV public --- > 10 10 010a00 id N4 No_Light FC F-Port 1 N Port + 1 NPIV public 29c29 < 13 13 010d00 id N4 Online FC F-Port 50:06:01:67:3b:20:23:0a --- > 13 13 010d00 id N4 No_Light FC F-Port 50:06:01:67:3b:20:23:0a
Run Code Online (Sandbox Code Playgroud)
理想情况下,这应该在电子邮件中看起来像这样..
16c16 < 0 0 010000 id N4 Online FC F-Port 1 N Port + 1 NPIV public --- > 0 0 010000 id N4 No_Light FC F-Port 1 N Port + 1 NPIV public
26c26 < 10 10 010a00 id N4 Online FC F-Port 1 N Port + 1 NPIV public --- > 10 10 010a00 id N4 No_Light FC F-Port 1 N Port + 1 NPIV public
29c29 < 13 13 010d00 id N4 Online FC F-Port 50:06:01:67:3b:20:23:0a --- > 13 13 010d00 id N4 No_Light FC F-Port 50:06:01:67:3b:20:23:0a
Run Code Online (Sandbox Code Playgroud)
输出应在电子邮件中一次显示一行。有什么建议?
问题是您用来执行diff. 每次该命令运行它的结果,无论是否有差异,都会触发该mail命令。
在这里,我们将使用 2 个echo命令来模拟 2 个文件,如下所示:
$ diff <(echo 1) <(echo 2)
1c1
< 1
---
> 2
Run Code Online (Sandbox Code Playgroud)
这看起来没问题,但是当echo命令相同时会发生什么?
$ diff <(echo 1) <(echo 1)
$
Run Code Online (Sandbox Code Playgroud)
好的,所以这似乎不是问题,是吗?如果我们将diff命令的输出通过管道传递给另一个echo命令会怎样:
$ diff <(echo 1) <(echo 1) | echo "hi"
hi
Run Code Online (Sandbox Code Playgroud)
甚至从diff管道到另一个命令的空输出也会触发该命令运行。
你真正想做的是两件事之一。要么检查diff命令的状态,要么使用逻辑运算符,例如和&&(和)或运算符||(或运算符)。
大多数命令在执行时都会返回一个状态。通常用 0 或 1 表示它们运行成功或失败。您可以diff通过分析$?Bash 中的状态变量来查看状态。
diff 如果文件匹配,则返回 0
$ diff <(echo 1) <(echo 1)
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
diff 如果文件不匹配,则返回 1
$ diff <(echo 1) <(echo 2)
1c1
< 1
---
> 2
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
所以它本身似乎很有用,我们可以判断一个命令是否成功运行。但是,我们没有办法对此采取行动。那么让我们看看逻辑运算符。
另一种方法是更改 2 个命令,如果第一个命令成功,则第二个命令将运行。相反,如果第一个命令失败,您可以使用替代运算符运行第二个命令。
不同的语用
$ diff <(echo 1) <(echo 2) || echo "they're different"
1c1
< 1
---
> 2
they're different
Run Code Online (Sandbox Code Playgroud)
相同的语用
$ diff <(echo 1) <(echo 1) && echo "they're the same"
they're the same
Run Code Online (Sandbox Code Playgroud)
注意:如果您使用此方法,应谨慎使用。结构类型存在一个问题,因为以上都是真正的逻辑运算符,就像 if .. then .. else 一样。您可以在bashpitfalls 网站上阅读这些内容。
所以这似乎是一种有效的方法。但也许还有另一种方式。继续阅读。
第三种方法是使用 if/then 块来运行mail程序。if/then 命令与我一分钟前提到的逻辑运算符有关,它们被称为条件。
注意:也diff确实不是用于 if/then 语句的最佳工具。最好使用cmp可以仅返回状态而仅返回状态的命令。所以让我们现在也升级它。
相同的
$ cmp -s <(echo 1) <(echo 1)
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
不同的
$ cmp -s <(echo 2) <(echo 1)
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
将其扩展为 if/then 块将如下所示:
$ if cmp -s <(echo 2) <(echo 1);then echo "same"; else echo "different";fi
different
$ if cmp -s <(echo 1) <(echo 1);then echo "same"; else echo "different";fi
same
Run Code Online (Sandbox Code Playgroud)
然后,您可以为原始问题执行以下操作:
if cmp -s switchshow_reference switchshow_results; then
diff switchshow_reference switchshow_results \
| mail -s device_PORT_ERROR email_recipient
fi
Run Code Online (Sandbox Code Playgroud)
在查看更新后的脚本时,您需要进行以下修改:
ssh test@ip_of_device switchshow > switchshow_results
variable=$(diff switchshow_reference switchshow_results)
if [[ $variable -eq 0 ]]
then
echo $"nothing"
else
echo -n "$variable" | mail -s switch_HARDWARE_CHECK recipeint_email_address
fi
Run Code Online (Sandbox Code Playgroud)
您在输出显示为一行时遇到的问题是由于您使用了 ,echo而没有告诉它扩展特殊字符,例如\n. 例如:
$ echo "oneline\ntwoline"
oneline\ntwoline
$ echo -e "oneline\ntwoline"
oneline
twoline
Run Code Online (Sandbox Code Playgroud)
我所做的另一项修改是您如何执行diff. 这并没有以不好的方式影响您的功能,但是反引号(\..` ) has been deprecated in favor of this notation,$(...)` 。这些具有能够将命令嵌套在其他命令中的额外好处,例如:
$ myvar=$(echo "good + $(echo bye)")
$ echo $myvar
good + bye
Run Code Online (Sandbox Code Playgroud)