我有一个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.
我在做什么错?
@ventatsu感谢您的快速响应。无法添加更多模块的问题使IO :: Socket :: SSL成为非启动器,但我确实发现“IPC :: Open2”**对我来说是可用的,到目前为止,我几乎得到了一个工作SSL测试... – furriephillips
我会在我的原始文章@ventatsu的更新中解释,所以我可以有多行输出。 – furriephillips