【问题标题】:Unable to connect to POP3 server using Bash script无法使用 Bash 脚本连接到 POP3 服务器
【发布时间】:2014-11-08 06:51:58
【问题描述】:

我在 shell 脚本中遇到了一个奇怪的问题。我正在尝试编写一个简单的脚本来连接到 POP3 服务器并计算邮箱中的邮件数量。 服务器上的 Bash 版本是:3.2.25(1)-release on Linux box。

当我手动键入命令来执行此操作时,它可以工作。

$ telnet <pop3 server ip> 110
Trying <pop3 server ip>...
Connected to <pop3 server ip>.
Escape character is '^]'.
+OK The Microsoft Exchange POP3 service is ready.
USER sadmin
+OK
PASS sadmin
+OK User successfully logged on.
STAT
+OK 1 10320
quit
+OK Microsoft Exchange Server 2010 POP3 server signing off.
Connection closed by foreign host.

现在为了计算消息数量,我编写了下面的脚本。

#!/bin/bash
exec 3<> /dev/tcp/<pop3 server ip>/pop3
read ok line <&3
echo $ok $line
echo USER sadmin >&3
read ok line <&3
echo aft userid entered:$ok $line
echo PASS sadmin1 >&3
echo STAT >&3
read num num1 <&3
echo $num $num1
echo quit >&3
exit

当我运行这个脚本时,输出如下所示。

$ ./tcp.sh
+OK The Microsoft Exchange POP3 service is ready.
aft userid entered:-ERR Connection is closed. 12
$

在我将密码发送到 fd 3 后,它需要很长时间才能读取它,然后它返回消息为“-ERR 连接已关闭”。

你能告诉我我在这里缺少什么吗?

【问题讨论】:

  • 理论上POP3需要CR+LF,而不仅仅是LF。有些服务器接受简单的 LF ,有些则不接受。所以你最好显式添加 CR。

标签: linux bash shell tcp pop3


【解决方案1】:

因为它的微软你可能需要一个 CRLF 而不是一个简单的 UNIX 换行符,我无法测试它,但我会尝试类似的东西:

E.g. crlf="$(echo xy | tr xy '\r\n')"

#!/bin/bash
crlf="$(echo xy | tr xy '\r\n')" 
exec 3<> /dev/tcp/<pop3 server ip>/pop3
read ok line <&3
echo $ok $line
echo -en "USER sadmin$crlf" >&3
read ok line <&3
echo aft userid entered:$ok $line
echo -en "PASS sadmin1$crlf" >&3
echo -en "STAT$crlf" >&3
read num num1 <&3
echo $num $num1
echo -en "quit$crlf" >&3
exit

【讨论】:

  • 为什么tr 这么神奇?您可以使用cr='\r'; echo -e "foo$cr" 或更清晰的crlf='\r\n'; echo -en "foo$crlf" 来获取foo&lt;CRLF&gt;
  • 它应该可以工作,但是 CR LF 因具有不同的解释而臭名昭著,而 tr 在生成适当的字符方面长期以来享有盛誉。 (它仍然不像 Windows 那样 ^M)
  • 您可以在此处阅读有关这些问题的更多信息:stackoverflow.com/questions/1552749/…
  • 从来没有听说过 'echo' 版本,它不能与 -en 和 '\r\n' 一起正常工作。在这种情况下还是 bash 版本,因为这里的 'echo' 是 bash 内置命令。
  • 在我的系统上,echo 不是内置的 bash,并且 echo 命令有各种行为 - 您是否阅读了上面的链接数据?这不是微不足道的,微软早期使用的 CRLF 实际上是一个 EOL,它是一个单一的字符。代替单字符 EOL 的所有双字符 \r\n 甚至单字符 \r 都不同于 Microsoft 使用的单字符 EOL。
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2018-09-03
  • 2020-03-16
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多