Máy quét cổng ngắn nhất


8

Viết chương trình ngắn nhất sẽ cố gắng kết nối với các cổng mở trên máy tính từ xa và kiểm tra xem chúng có mở không. (Nó được gọi là Máy quét cổng )

Lấy đầu vào từ các đối số dòng lệnh.

your-port-scanner host_ip startPort endPort

Giả sử, startPort <endPort (và endPort - startPort < 1000)

Đầu ra: Tất cả các cổng mở giữa phạm vi đó nên có dấu cách hoặc dấu phẩy được phân tách.


Có bất kỳ lý do pháp lý để đi về việc sử dụng máy quét cổng? Ngoại trừ việc ngăn chặn người khác xâm nhập vào mạng của bạn bằng cách đóng các cổng không cần thiết?
Alexander Craggie

Câu trả lời:


5

sh / netcat, 39

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

Netcat thực hiện quét và trả về kết quả ở dạng này với lỗi tiêu chuẩn:

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

cutxargstrích xuất số cổng và tạo một dòng duy nhất từ ​​nó.

Nhắc tôi tắt SMTP trên nút đó.


3

Perl, 92

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

Perl 5.10 trở lên, chạy với perl -E 'code here'.

Sử dụng regex để nén lâu IO::Socket::INET, sau đó eval; định dạng cuối cùng được thực hiện với nội suy mảng.

Theo yêu cầu, một lời giải thích chi tiết hơn. Để ungolf, trước tiên hãy tôn trọng:

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

Dòng trước khi evalthay thế tất cả (hai) lần xuất hiện của 'I' bằng 'IO :: Socket :: INET', đó là một mẹo chơi gôn Perl tiêu chuẩn để giảm tác động của các số nhận dạng dài không thể tránh khỏi. Đặt tên cho một số tạm thời, mã sau đó tương đương với điều này:

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

Tóm lại: đọc các đối số phạm vi máy chủ và cổng từ dòng lệnh; cố gắng kết nối với tất cả chúng theo thứ tự ( IO::Socket::INET->new()); giữ một danh sách những người đã thành công ( grep); hiển thị kết quả độc đáo ( say).


Không thể hiểu bằng cách nào đó :( trông giống như ma thuật đen sâu nhất đối với tôi: P nhưng vẫn là +1 cho sự kỳ lạ
masterX244

@ masterX244 Tôi đã nói chi tiết về bộ phận bên trong một chút. HTH
JB

1

sh / nmap / GNU grep / xargs - 36

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

Theo thông số kỹ thuật đầu vào và đầu ra:

$ sh 1109.sh 127.0.0.1 1 80
22 25 80

2
Tôi không biết nếu nmapđược tính là một câu trả lời hợp lệ ở đây, nhưng chắc chắnkhôngsh :)
Eelvex

Các định dạng đầu ra cũng có thể sử dụng một chút đánh bóng.
JB

2
@Eelvex đó là một tập lệnh sh, với your-port-scanner host_ip startPort endPortgiao diện, gọi nmap ;-)
Arnaud Le Blanc

@JB, xong :-) __
Arnaud Le Blanc

không nmapđi kèm với linux? : - \ tôi không biết rằng ... :(
st0le

1

Hồng ngọc - 85

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

1

BASH - 105

Trong BASH thuần túy (tức là không có nmap hoặc netcat).

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

Khi sử dụng với một địa chỉ không phải localhost, thời gian chờ khá dài (theo thứ tự phút) khi gặp một cổng đóng, do đó, một số loại chức năng hết thời gian / báo động sẽ được yêu cầu trong mọi khả năng.


0

PHP - 70

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

Tôi chắc rằng bạn có thể siết chặt $p++trong đề cập khác $p, sẽ tiết kiệm được một char ...
st0le

0

Perl, 178

Tôi mới biết về Perl, mọi lời khuyên về rút ngắn đều được đánh giá cao!

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;}} 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.