Pemindai Port Terpendek

8

Tulis program terpendek yang akan mencoba untuk terhubung ke port terbuka pada komputer jarak jauh dan periksa apakah port tersebut terbuka. (Ini disebut Port Scanner )

Ambil input dari argumen baris perintah.

your-port-scanner host_ip startPort endPort

Asumsikan, startPort <endPort (dan endPort - startPort < 1000)

Output: Semua port terbuka antara rentang itu harus spasi atau dipisah koma.

st0le
sumber
Apakah ada alasan hukum untuk menggunakan pemindai porta? Kecuali untuk menghentikan orang lain meretas ke jaringan Anda dengan menutup port yang tidak perlu?
Alexander Craggs

Jawaban:

5

sh / netcat, 39

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

Netcat melakukan pemindaian dan mengembalikan hasil dalam bentuk ini pada kesalahan standar:

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

cutdan xargsekstrak nomor port dan buat satu baris dari itu.

Ingatkan saya untuk mematikan SMTP pada simpul itu.

JB
sumber
3

Perl, 92

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

Perl 5.10 atau lebih baru, jalankan dengan perl -E 'code here'.

Menggunakan regex untuk kompres selama itu IO::Socket::INET, lalu eval; pemformatan akhir dilakukan dengan interpolasi array.

Atas permintaan, penjelasan lebih rinci. Untuk ungolf, pertama mari kita respace:

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

Baris sebelum evalmengganti semua (dua) kejadian 'I' dengan 'IO :: Socket :: INET', itu adalah trik standar golf Perl untuk mengurangi dampak pengidentifikasi panjang yang tidak dapat dihindari. Memberi penamaan sementara, kode ini kemudian setara dengan ini:

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

Singkatnya: baca argumen kisaran host dan port dari baris perintah; coba koneksi ke semuanya secara berurutan ( IO::Socket::INET->new()); simpan daftar mereka yang berhasil ( grep); tampilkan hasilnya dengan baik ( say).

JB
sumber
entah kenapa tidak bisa :( kelihatannya seperti ilmu hitam terdalam bagi saya: P tapi masih +1 untuk keanehan
masterX244
@ masterX244 Saya sudah sedikit merinci jeroan. HTH
JB
1

sh / nmap / GNU grep / xargs - 36

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

Mengikuti spesifikasi input dan output:

$ sh 1109.sh 127.0.0.1 1 80
22 25 80
Arnaud Le Blanc
sumber
2
Saya tidak tahu apakah nmapdianggap sebagai jawaban yang valid di sini, tetapi jelas tidak sh :)
Eelvex
Format output juga bisa menggunakan sedikit pemolesan.
JB
2
@Eelvex itu skrip sh, dengan your-port-scanner host_ip startPort endPortantarmuka, memanggil nmap ;-)
Arnaud Le Blanc
@ JP, selesai :-) __
Arnaud Le Blanc
apakah nmapdibundel dengan linux? : - \ saya tidak tahu itu ... :(
st0le
1

Ruby - 85

require"socket"
h,p,e=$*
p.upto(e){|p|begin
TCPSocket.new h,p
$><<"#{p} "
rescue
end}
Arnaud Le Blanc
sumber
1

BASH - 105

Dalam BASH murni (yaitu tidak ada nmap atau netcat).

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

Ketika menggunakan dengan alamat selain localhost, batas waktu cukup lama (dalam urutan menit) ketika bertemu dengan port tertutup sehingga beberapa fungsi batas waktu / alarm akan diperlukan dalam semua kemungkinan.

JOgden
sumber
0

PHP - 70

<?for(list(,$h,$p,$e)=$argv;$p<=$e;++$p)@fsockopen($h,$p)&&print"$p ";
Arnaud Le Blanc
sumber
Saya yakin Anda dapat menekan $p++dalam menyebutkan lain $p, akan menghemat satu char ...
st0le
0

Perl, 178

Saya baru mengenal Perl, semua saran tentang pemendekan dihargai!

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;}} 
Timtech
sumber