【Perl】ポートが空いているかどうかを調べるワンライナー
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
「あるサーバの特定のポートが空いているかどうかを今すぐに調査したいけど、nmapもtelnetも使えない…(がPerlは使える!)」という状況で、とっさに使えるワンライナーです。
2013/09/09 追記: 一部環境に対して、開いていないポートへリクエストした場合に無限に待ち続けてしまうことがあるため、コネクションタイムアウト(5秒)の設定を追加しました。
1 2 3 4 5 6 |
perl -mIO::Socket::INET -le 'print IO::Socket::INET->new(PeerAddr=>shift,PeerPort=>shift,Proto=>shift,Timeout=>5)?"open":"close"' HOST PORT [PROTO] (引数) HOST 調査対象サーバのホスト名またはIPアドレス PORT 調査対象のポート番号 PROTO "tcp"(デフォルト)または"udp" |
使用例は以下のとおりです。
1 2 3 4 5 6 |
# perl -mIO::Socket::INET -le 'print IO::Socket::INET->new(PeerAddr=>shift,PeerPort=>shift,Proto=>shift,Timeout=>5)?"open":"close"' localhost 161 udp open # perl -mIO::Socket::INET -le 'print IO::Socket::INET->new(PeerAddr=>shift,PeerPort=>shift,Proto=>shift,Timeout=>5)?"open":"close"' localhost 161 close # perl -mIO::Socket::INET -le 'print IO::Socket::INET->new(PeerAddr=>shift,PeerPort=>shift,Proto=>shift,Timeout=>5)?"open":"close"' localhost 22 open |
少々長くて使いにくい…という場合は、以下のように、ダブルクォートをクォート風演算子に変更したうえで、ワンライナー全体をダブルクォートで囲めば、bash等のaliasとして登録することも可能です。
1 2 3 4 5 6 7 8 |
# grep chkport ~/.bashrc alias chkport="perl -mIO::Socket::INET -le 'print IO::Socket::INET->new(PeerAddr=>shift,PeerPort=>shift,Proto=>shift,Timeout=>5)?q{open}:q{close}'" # chkport localhost 161 udp open # chkport localhost 161 close # chkport localhost 22 open |
ちなみに、IO::Socket::INETは、Perl 5.6からコアモジュールとなっているため、最近のPerlなら、特にこのモジュールを追加でインストールする必要もありません。
1 2 3 |
# corelist IO::Socket::INET IO::Socket::INET was first released with perl 5.006 |
以上、簡単ですがPerlに関する話題をご紹介しました。