最短のポートスキャナー


8

リモートコンピューターの開いているポートに接続して、開いているかどうかを確認する最短のプログラムを記述します。(これはポートスキャナーと呼ばれます)

コマンドライン引数から入力を受け取ります。

your-port-scanner host_ip startPort endPort

startPort <endPort(およびendPort - startPort < 1000)

出力:その範囲の間のすべての開いているポートは、スペースまたはカンマで区切る必要があります。


ポートスキャナーを使用する法的理由はありますか?他の人が不要なポートを閉じてネットワークにハッキングするのを止める以外は?
— Alexander Craggs 2014

回答:


5

sh / netcat、39

nc -vz $1 $2-$3 2>&1|cut -f3 -d\ |xargs

Netcatはスキャンを行い、標準エラー時にこの形式で結果を返します。

localhost [127.0.0.1] 22 (ssh) open
localhost [127.0.0.1] 25 (smtp) open

cutそしてxargs、ポート番号を抽出し、それから単一の行を作成します。

そのノードでSMTPをシャットダウンするよう通知してください。


3

Perl、92

$_='use I;$h=shift;grep I->new("$h:$_"),shift..shift';
s/I/IO::Socket::INET/g;@_=eval;say"@_"

Perl 5.10以降、で実行しperl -E 'code here'ます。

正規表現を使用してIO::Socket::INET、その長さを圧縮しevalます。配列補間で行われる最終的なフォーマット。

リクエストにより、より詳細な説明。ゴルフをやめるには、まずスペースを変更しましょう。

$_ = << 'EOC';
  use I;
  $h = shift;
  grep I->new("$h:$_"), shift..shift;
EOC
s/I/IO::Socket::INET/g;
@_ = eval;
say "@_";

の前の行evalは、 'I'のすべて(2つ)を 'IO :: Socket :: INET'に置き換えます。これは、避けられない長い識別子の影響を減らすための標準的なPerlゴルフトリックです。いくつかの一時的な名前を付けると、コードは次のようになります。

use IO::Socket::INET;
$h = shift;
$p1 = shift;
$p2 = shift;
@_ = grep IO::Socket::INET->new("$h:$_"), ($p1 .. $p2);
say "@_";

簡単に言うと、コマンドラインからホストとポートの範囲の引数を読み取ります。それらのすべてに順番に接続を試みます(IO::Socket::INET->new()); 成功した人のリストを保持する(grep); 結果をきれいに表示します(say)。


どういうわけか理解できません:(私にとっては最も深い黒魔術のように見えます:Pでも、奇妙さのための+1
— masterX244

@ masterX244内部を少し詳しく説明しました。HTH
— JB

1

sh / nmap / GNU grep / xargs-36

nmap -p$2-$3 $1|grep -Po '^\d+'|xargs

入力と出力の仕様に従います。

$ sh 1109.sh 127.0.0.1 1 80
22 25 80

2
nmapここで有効な回答として数えられるかどうかはわかりませんが、間違いなくそうです sh :)
— Eelvex

出力フォーマットも少し磨きをかけることができます。
— JB

2
@Eelvexはshスクリプトであり、your-port-scanner host_ip startPort endPortnmapを呼び出すインターフェイスを備えた;-)
— Arnaud Le Blanc

@JB、完了:-) __
— Arnaud Le Blanc

んnmapのLinuxにバンドルされてきますか?:-\知らなかった... :(
— st0le


1

バッシュ-105

純粋なBASH(つまり、nmapまたはnetcatなし)。

exec 2>&- && exec 2<> /dev/null
for p in $(seq $2 $3); do
    > /dev/tcp/$1/$p &&
    echo -n "$p "
done

localhost以外のアドレスで使用する場合、閉じたポートに遭遇したときのタイムアウトはかなり長い(分単位)ため、何らかのタイムアウト/アラーム機能が必要になる可能性があります。


0

PHP-70

<?for(list(,$h,$p,$e)=$argv;$p<=$e;++$p)@fsockopen($h,$p)&&print"$p ";

私はあなたがの$p++他の言及で絞ることができると確信しています$p、1つの文字を節約します...
— st0le

0

Perl、178

私はPerlを初めて使用するので、短縮についてのアドバイスはありがたいです。

use IO::Socket::INET;for($x=$ARGV[1];$x<$ARGV[2]+1;$x++){if(fork()){if($sock=new IO::Socket::INET(PeerAddr=>$ARGV[0],PeerPort=>$x,Proto=>'tcp')){print"$x ";}close($sock);exit;}} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.