主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

telnet で ssl 接続をしたい

最終更新日 2012-12-01 16:01:32 (1年以上前の記事です)

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;
}
最終更新日 2012-12-01 16:01:32

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank1, rank2, rank3, rank7, rank9, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google