#!/usr/local/bin/perl -w # ip.pl Minimum Edition 0.2.1 # Based echo-server.pl,v1.1 68user # Powered by Muller Norland # Last Modified: Mon, 18 Aug 2003 12:31:19 +0900 # telnetプロトコルによるIP抜きスクリプトの最小機能版です。 # ソースの再配布、改変、他言語への移植、及びその他の行為は自由です。 # 4行目の"Based echo-server.pl,v1.1 68user"の記述はなるべく消さないようにしてください。 # このスクリプトは完全に無保証です。使用は自己の責任に於いて行って下さい。 # このスクリプトに関する質問を68user氏にはしないで下さい。 # 蛇足ですが、こういうものがあまり出回ると串の意味が薄れると言うかなんと言うか……。 # 冒頭の記述に反するようですが、できれば自分だけでこっそり使って喜ぶ程度にしといてもらえると嬉しいです。 # バージョン0.2.0からシグナルを使うようになったので、Windows系サーバーでは動きません。 # 最近の変更点 # 0.2.0→0.2.1: タイムアウト判定が期待通りに機能していなかったのを修正。タイムアウト後も処理を続行するようにした。 # 0.1.1→0.2.0: クライアントから既定時間(デフォルトは60秒)接続がなかったらタイムアウトするようにした。 # 環境変数QUERY_STRINGに数字がセットされていたらip_catch、そうでなければprint_frameを呼び出す if($ENV{'QUERY_STRING'}){ if($ENV{'QUERY_STRING'} =~ /^[0-9]+$/){ $port = $ENV{'QUERY_STRING'}; &ip_catch; } else{exit;} } else{&print_frame;} sub print_frame{ $host = "";# スクリプトを設置するサーバーのホスト名を指定(例: "www.tok2.com") $script_location = "";# スクリプトを設置する場所を相対URI(./ip.pl)もしくは絶対URIで指定(例: "http://www.tok2.com/user/cgi-bin/ip.pl") srand(time ^ ($$ + ($$ << 15))); $port = int(rand(64511)) + 1024; print <<"_HEADER_"; Content-type: text/html _HEADER_ &print_header; print <<"_BODY_"; <body> <h1>telnetプロトコルによるIP抜き</h1> <p>フレーム未対応の場合は下のURIに直接アクセスして下さい。<br> 上から順にアクセスしないと上手くいきません。</p> _BODY_ print "<p><a href=\"$script_location?$port\">$script_location?$port</a><br>\n"; print "<a href=\"telnet://$host:$port\">telnet://$host:$port</a></p>\n"; print <<"_BODY_"; </body> _BODY_ exit; } sub ip_catch{ if(($port < 1024) || (65535 < $port)){exit;}# (1024≦$port≦65535)を満たすかどうかの検証 &launch_server; print <<"_HEADER_";# 取得情報を表示 Content-type: text/html _HEADER_ &print_header; print <<"_BODY_";

telnetプロトコルによるIP抜き

_BODY_ print "\n"; print "\n"; print <<"_BODY_";
Real IPReal Host
$client_ip$client_hostname
Real IP
クライアントの生IP
Real Host
クライアントの生ホスト
_BODY_ &send_message_to_client; exit; } sub print_header{ print <<"_HEADER_"; telnetプロトコルによるIP抜き _HEADER_ } sub launch_server{ $timeout = 60;# タイムアウトまでの時間を指定 use Socket; socket(CLIENT_WAITING,PF_INET,SOCK_STREAM,0) or die "ソケットを生成できません。$!";# ソケット生成 setsockopt(CLIENT_WAITING,SOL_SOCKET,SO_REUSEADDR,1) or die "setsockopt に失敗しました。$!";# ソケットオプション設定 bind(CLIENT_WAITING,pack_sockaddr_in($port,INADDR_ANY)) or die "bind に失敗しました。$!";# ソケットにアドレス(=名前)を割り付ける listen(CLIENT_WAITING,SOMAXCONN) or die "listen: $!";# ポートを見張る eval{ local $SIG{ALRM} = sub { die "timeout\n" }; alarm $timeout; $paddr = accept(CLIENT,CLIENT_WAITING); alarm 0; }; alarm 0; if($@){ die "client connect: $@" unless $@ eq "timeout\n"; # タイムアウト時 $client_ip = "(connection timed out)"; $client_hostname = "(connection timed out)"; $client_port = "(connection timed out)"; return; } # ホスト名、IPアドレス、クライアントのポート番号を取得 ($client_port,$client_iaddr) = unpack_sockaddr_in($paddr); $client_hostname = gethostbyaddr($client_iaddr,AF_INET); $client_ip = inet_ntoa($client_iaddr); } sub send_message_to_client{ select(CLIENT); $|=1; select(STDOUT);# クライアントに対してバッファリングしない print CLIENT "telnetプロトコルによるIP抜き\r\n","ip.pl Minimum Edition 0.2.1";# クライアントにメッセージを表示 close(CLIENT); }