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; }