Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用shell脚本将telnet中的SMTP会话保存在日志中_Bash_Telnet - Fatal编程技术网

Bash 使用shell脚本将telnet中的SMTP会话保存在日志中

Bash 使用shell脚本将telnet中的SMTP会话保存在日志中,bash,telnet,Bash,Telnet,我正在创建一个脚本来测试HELO的电子邮件 直接在telnet控制台中,命令运行正常,但在脚本中,我无法获得输出 在bash中: $ telnet alt1.aspmx.l.google.com 25 HELO verify-email.org MAIL FROM: <check@verify-email.org> RCPT TO: <test@gmail.com> quit 或 不会带来任何结果。一般来说,您可能不希望通过管道将内容传输到telnet。一个合理的选择

我正在创建一个脚本来测试HELO的电子邮件

直接在
telnet
控制台中,命令运行正常,但在脚本中,我无法获得输出

在bash中:

$ telnet alt1.aspmx.l.google.com 25
HELO verify-email.org
MAIL FROM: <check@verify-email.org>
RCPT TO: <test@gmail.com>
quit



不会带来任何结果。

一般来说,您可能不希望通过管道将内容传输到telnet。一个合理的选择是
netcat
(在大多数系统上是
nc

也就是说,我不久前写了一篇文章,依靠bash的内部支持进行TCP套接字连接。SMTP客户端稍微复杂一些,但仍然相当简单。很好。您可以加载一组命令,然后一次读取多个响应行

#!/usr/bin/env bash

target="$1"
address="$2"

success=""

# Open a two-way socket connection on fd/3
exec 3<>/dev/tcp/$target/25

# Stand back, we're doing SMTP!
printf "HELO $HOSTNAME\r\n" >&3
printf "MAIL FROM: <$USER@$HOSTNAME>\r\n" >&3
printf "RCPT TO: <$address>\r\n" >&3
printf "QUIT\r\n" >&3

# Now that we've had our say, it's time to listen.
while read -u 3 code message; do
  echo ">> <$code> ${message%$'\r'}"    # Debugging output
  case "$code" in
    2??) success="${success:-true}" ;;  # Only set variable if it's not already set
    5??) success=false ;;               # (i.e. false overrides all other responses)
  esac
done

# Close connections, clean up after ourselves
exec 3<&-; exec 3>&-

if [ -z "$success" ]; then
        echo "NOTICE: Not sure we reached an SMTP server..."
        exit 1
elif $success; then
        echo "NOTICE: All's well, $target accepts mail for $address"
else
        echo "NOTICE: I detected a failure."
        exit 1
fi
#/usr/bin/env bash
target=“$1”
地址=“2美元”
success=“”
#打开fd/3上的双向插座连接
exec 3/dev/tcp/$target/25
#退后,我们在做SMTP!
printf“HELO$HOSTNAME\r\n”>&3
printf“邮件发件人:\r\n”>&3
printf“RCPT TO:\r\n”>&3
printf“退出\r\n”>&3
#现在我们已经有了发言权,是时候倾听了。
读取-u 3代码信息时;做
echo“>>${message%$'\r'}”#调试输出
中的大小写“$code”
2??)success=“${success:-true}”;#仅在尚未设置变量时设置该变量
成功=错误;#(即,false覆盖所有其他响应)
以撒
完成
#密切联系,打扫干净
执行官3&-
如果[-z“$success”];然后
echo“注意:不确定我们是否已到达SMTP服务器…”
出口1
elif$成功;然后
echo“注意:一切正常,$target接受$address的邮件”
其他的
echo“注意:我检测到一个故障。”
出口1
fi

请注意
${message%$'\r'}
的参数扩展,如果是CR,则会从行中删除最后一个字符。之所以这样做,是因为SMTP响应使用
\r\n
作为换行符,而脚本可能只将
\r
视为行的一部分(或$message变量).

550-5.1.1您试图访问的电子邮件帐户不存在。
似乎是合理的回答。您是否确实知道
test@gmail.com
是否作为有效id?很好的Q和良好的研究/记录。继续发帖!祝你好运。我同意,这是一个很好的第一个问题。:)尤其让人印象深刻的是你阅读了整个互联网。我已经在这方面工作了很多年,但似乎还没有完成。确实研究得非常好,但我对“尼斯Q”保持着我的热情,它的配方简直是亵渎神明:^)幸运的是,这并不难解决。@ivan_pozdeev-“真的亵渎神明”?哇!为了什么宗教?无论如何,这个问题满足一个好问题的所有要求——示例代码(几次!)、预期输出、实际输出、解释。如果您不同意代码或方法,下面会有一个带有您姓名的标签。也。。可惜你把幽默删掉了。有趣的帖子多得多。。有趣。@ghoti代表StackOverflow的宗教!^-^那些我几乎无法理解的符号,加上相当一部分多余的废话,是在侮辱我的宗教感情>:)@RodrigoHA FYI,那么你可能想知道答案。
{ echo "HELO verify-email.org"; sleep 1; echo "MAIL FROM: <check@verify-email.org>"; sleep 1; echo "RCPT TO: <test@gmail.com>" ; sleep 1 ;  echo quit } | telnet alt1.aspmx.l.google.com 25
#!/usr/bin/expect -f

spawn  alt1.aspmx.l.google.com 25
send '"HELO verify-email.org\r"'
send '"MAIL FROM: <check@verify-email.org>\r"'
send '"RCPT TO: <test@gmail.com>\r"'
send '"quit\r"'
sh aa 1> aa.txt 2>&1
sh aa &> aa.txt
#!/usr/bin/env bash

target="$1"
address="$2"

success=""

# Open a two-way socket connection on fd/3
exec 3<>/dev/tcp/$target/25

# Stand back, we're doing SMTP!
printf "HELO $HOSTNAME\r\n" >&3
printf "MAIL FROM: <$USER@$HOSTNAME>\r\n" >&3
printf "RCPT TO: <$address>\r\n" >&3
printf "QUIT\r\n" >&3

# Now that we've had our say, it's time to listen.
while read -u 3 code message; do
  echo ">> <$code> ${message%$'\r'}"    # Debugging output
  case "$code" in
    2??) success="${success:-true}" ;;  # Only set variable if it's not already set
    5??) success=false ;;               # (i.e. false overrides all other responses)
  esac
done

# Close connections, clean up after ourselves
exec 3<&-; exec 3>&-

if [ -z "$success" ]; then
        echo "NOTICE: Not sure we reached an SMTP server..."
        exit 1
elif $success; then
        echo "NOTICE: All's well, $target accepts mail for $address"
else
        echo "NOTICE: I detected a failure."
        exit 1
fi