2012-05-25 20 views
3

我有一个POP3登录测试脚本,它使用IO::Socket::INET读取和写入TCP:110上打开的套接字。这是我已经习惯了: -是否可以为system()调用创建读/写FileHandle?

my $sock = IO::Socket::INET->new(
    PeerAddr => "$h:$port", 
    Proto  => "tcp", 
) or die "$!\n"; 

不过,我也需要测试通过SSL安全POP3S(TCP:995)相同的POP3对话。

我发现我可以使用命令行,这让我类似的状态“的telnet主机名110”以下,但加密: -

openssl s_client -crlf -connect hostname:995 

我希望能找到一个我可以在openssl命令上设置某种读/写FileHandle或套接字的方式,我可以直接读取它,然后将所需的POP3命令写入,然后读取响应,等等......

我觉得,因为我可以在屏幕上看到它,它足够接近抓取,但我不太了解perl的方式,以“得到它”,并继续前进!

不幸的是,这个脚本将运行的服务器不能安装更多的perl模块,这可能是一个明显的解决方案。

UPDATE

感谢@ventatsu为灵感,我现在用的IPC::Open2这样的: -

my ($sslread,$sslwrite); 
my $ssl_fh = open2(
    $sslread, 
    $sslwrite, 
    "openssl s_client -crlf -connect mail.example.com:995" 
) or die "$!\n"; 

while (<$sslread>) { 
    print; 
    if (/^\+OK.*$/) { 
     ## Try to log in 
     print $sslwrite "USER $u\r\n"; 
     print "USER $u\n"; 
     while (<$sslread>) { 
      print; 
      if (/^\+OK.*$/) { 
       ## Keep going 
       print $sslwrite "PASS $p\r\n"; 
       print "PASS $p\n"; 
       while (<$sslread>) { 
        print; 
       }  
      }  
     }  
     print $sslwrite "QUIT"; 
     print "QUIT\n"; 
    }  
}  

waitpid($ssl_fh, 0); 
my $child_exit_status = $? >> 8; 

我非SSL测试纸条的工作原理正是如此: -

Testing pop3 on mail.example.com:110 
+OK The Microsoft Exchange POP3 service is ready. 
USER [email protected] 
+OK 
PASS Abcd3fGh 
+OK User successfully logged on. 

当我在CLI上的交互式SSL会话中运行POP3命令时,证书工作正常,如下所示: -

openssl s_client -crlf -connect mail.example.com:995 
<snip out the SSL bumph /> 
+OK The Microsoft Exchange POP3 service is ready. 
USER [email protected] 
+OK 
PASS Abcd3fGh 
+OK User successfully logged on. 

但我的SSL测试脚本只差一点作品正是如此: -

Testing pop3s on mail.example.com:995 
<snip out the SSL bumph /> 
+OK The Microsoft Exchange POP3 service is ready. 
USER [email protected] 
+OK 
PASS Abcd3fGh 
-ERR Logon failure: unknown user name or bad password. 

我在做什么错?

回答

1

您可以使用IPC::Open2附加两个文件句柄,一个用于输入,另一个用于输出程序。它可能更接近你真正想要使用的IO::Socket::SSL,其功能类似于IO::Socket::INET但是已加密。

更新: 我最好的猜测是你的翻倍\r字符。根据s_client的手册页-crlf将换行转换为回车+换行。当您打印到您发送的$sslwrite手柄时"\r\n"。我认为结果将是服务器在每个命令结束时会收到“\ r \ r \ n”。您可能想要从程序中的openssl命令中删除-crlf

+0

@ventatsu感谢您的快速响应。无法添加更多模块的问题使IO :: Socket :: SSL成为非启动器,但我确实发现“IPC :: Open2”**对我来说是可用的,到目前为止,我几乎得到了一个工作SSL测试... – furriephillips

+0

我会在我的原始文章@ventatsu的更新中解释,所以我可以有多行输出。 – furriephillips

相关问题