リモートコンピューターの開いているポートに接続して、開いているかどうかを確認する最短のプログラムを記述します。(これはポートスキャナーと呼ばれます)
コマンドライン引数から入力を受け取ります。
your-port-scanner host_ip startPort endPort
startPort <endPort(およびendPort - startPort < 1000)
出力:その範囲の間のすべての開いているポートは、スペースまたはカンマで区切る必要があります。
リモートコンピューターの開いているポートに接続して、開いているかどうかを確認する最短のプログラムを記述します。(これはポートスキャナーと呼ばれます)
コマンドライン引数から入力を受け取ります。
your-port-scanner host_ip startPort endPort
startPort <endPort(およびendPort - startPort < 1000)
出力:その範囲の間のすべての開いているポートは、スペースまたはカンマで区切る必要があります。
回答:
$_='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)。
nmap -p$2-$3 $1|grep -Po '^\d+'|xargs
入力と出力の仕様に従います。
$ sh 1109.sh 127.0.0.1 1 80
22 25 80
nmapここで有効な回答として数えられるかどうかはわかりませんが、間違いなくそうです sh :)
your-port-scanner host_ip startPort endPortnmapを呼び出すインターフェイスを備えた;-)
nmapのLinuxにバンドルされてきますか?:-\知らなかった... :(