当输出文件包含字符串

时间:2017-10-03 19:28:28

标签: linux bash sh

我尝试使用sh脚本来netcat一个IP,并在端口未应答时发送电子邮件。

到目前为止我有这个但是altought脚本正在工作并且输出文件已填写,但我收到的邮件是空的。我通过在输出文件中用vi写一些内容来调试它,然后我收到了我写的电子邮件。

这是脚本:

netcat -z -v -w x.x.x.x 23 > /path/resultt.txt 2>&1
if grep -q "timed out" /path/resultt.txt ;
then
    ssmtp email@gmail.com < /path/resultt.txt
else
    echo
fi

我认为这与做2>&1

有关

1 个答案:

答案 0 :(得分:0)

您使用2>&1或&#34;将stderr发送到与stdout相同的位置&#34;应该不是问题。如果最后一个参数是一个数字,我想确保我的重定向有fd编号。但是,没有它你的确有效。

我使用基于telnet的公共服务进行此演示。它应该适用于所有人,但是就像所有事物都是免费的一样,它可能不会永远存在。

$ nc telnetmyip.com 23 > /tmp/out 2>&1

$ cat /tmp/out
{


"comment": "##     Your IP Address is 96.67.120.126 (59742)     ##",


"family": "ipv4",
"ip": "96.67.120.126",
"port": "59742",
"protocol": "telnet",
"version": "v1.1.0",
"website": "https://github.com/packetsar/checkmyip"
}

所以,这完全符合预期。

现在,您说&#34;但我收到的邮件是空的&#34; 。根据您的代码,只有在&#34;超时后才会发送电子邮件。 存在于文件中。因此,发送空电子邮件的唯一方法是,如果您没有将正确的文件提供给ssmtp 正确的方式

您可能需要考虑像https://wiki.archlinux.org/index.php/SSMTP#Sending_email

中的示例一样
# only do this once
$ cat > header.txt <<'EOF'
To:email@gmail.com
From:youraccount@gmail.com
Subject: telnet resulted in a timeout

Hello, admin. I hope this doesn't ruin your day.

The command `netcat -z -v -w x.x.x.x 23 > /path/resultt.txt` resulted in this:
EOF

$ cat header.txt /path/resultt.txt | sendmail -t

我希望有所帮助。最后,我将重复:发送空电子邮件的唯一方法是,如果您没有将正确的文件提供给ssmtp 正确的方式。 (假设您已手动确认ssmtp在此环境中有效。)