telnet コマンドは基本的に平文の通信しかサポートしてなくて、 HTTPS プロトコルに HTTP コマンドを手動でちょっと発行したいときなどに対応できない。
debian には telnet-ssl っていうパッケージがあるみたい何だけど、 CentOS 5 上でコンパイルしようとしたらどうにもエラーで進まないので、ちょっと perl でサイトを色々参考にして作ってみた。その時のメモ。というかソース。
特に細かい説明は無し。
追記:最近はほとんど openssl の s_client でやっている。
$ openssl s_client -connect www.example.com:443
一応必要なのは perl と perl-IO-Socket-SSL とそれらに依存するパッケージ。 perl-IO-Socket-SSL は cpan2rpm でも rpmforge から取ってきても構わないと思う。
使いかたは ./command hostname port [-s]
-s 付けると SSL 通信。
./telnet-ssl.pl -s upload.mixi.jp 443みたいなかんじです。
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
use IO::Socket::SSL;
my $opt_addr = 0;
my $ssl = 0;
my $serv = "telnet";
my $addr = "127.0.0.1";
my $port = 23;
#
# Get options
#
while (my $opt = shift)
{
if ($opt eq "-s")
{
$ssl = 1;
}
elsif (! $opt_addr)
{
$addr = $opt;
$opt_addr = 1;
}
else
{
$serv = $opt;
$port = do
{
no warnings 'numeric';
$serv + 0
|| getservbyname( $serv, 'tcp' )
|| die "Unknown Service: $serv";
};
}
}
my $iaddr = gethostbyname ($addr) || die "Unknown Hostname: $addr";
my $peer_host = gethostbyaddr($iaddr, AF_INET) || $addr;
my $peer_addr = inet_ntoa ($iaddr);
print "Trying " . $peer_addr . "...\n";
my $socket;
if ($ssl)
{
$socket = IO::Socket::SSL->new ($peer_addr . ":" . $port)
|| die "$! $addr:$port";
}
else
{
$socket = IO::Socket::INET->new (PeerAddr => $addr, PeerPort => $port)
|| die "$! $addr:$port";
}
print "Connected to " . $peer_host . " (" . $peer_addr . ").\n";
print "Escape character is '^c'.\n";
if (my $pid = fork ())
{
STDOUT->autoflush (1);
while (<$socket>)
{
print STDOUT ($_);
}
kill INT => $pid;
}
else
{
$socket->autoflush (1);
while (<STDIN>)
{
print $socket ($_);
}
exit;
}