Escáner de puerto más corto

8

Escriba el programa más corto que intentará conectarse a puertos abiertos en una computadora remota y verifique si están abiertos. (Se llama Port Scanner )

Tomar datos de los argumentos de la línea de comandos.

your-port-scanner host_ip startPort endPort

Supongamos que startPort <endPort (y endPort - startPort < 1000)

Salida: todos los puertos abiertos entre ese rango deben estar separados por comas o espacios.

st0le
fuente
¿Hay alguna razón legal para usar escáneres de puertos? ¿Excepto para evitar que otras personas pirateen su red cerrando puertos innecesarios?
Alexander Craggs

Respuestas:

5

sh / netcat, 39

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

Netcat realiza el escaneo y devuelve resultados en este formulario en error estándar:

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

cuty xargsextraiga el número de puerto y forme una sola línea.

Recordarme que apague SMTP en ese nodo.

JB
fuente
3

Perl, 92

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

Perl 5.10 o posterior, ejecuta con perl -E 'code here'.

Utiliza expresiones regulares para comprimir tanto tiempo IO::Socket::INET, entonces eval; formateo final realizado con interpolación de matriz.

Por solicitud, una explicación más detallada. Para ungolf, primero volvamos a espacio:

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

La línea antes del evalreemplaza todas las (dos) ocurrencias de 'I' con 'IO :: Socket :: INET', ese es un truco de golf Perl estándar para reducir el impacto de los identificadores largos inevitables. Al nombrar algunos de los temporales, el código es equivalente a esto:

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

En pocas palabras: lea los argumentos de host y rango de puertos desde la línea de comandos; intenta una conexión con todos ellos en secuencia ( IO::Socket::INET->new()); mantener una lista de los que tuvieron éxito ( grep); muestra el resultado muy bien ( say).

JB
fuente
no puedo entender de alguna manera :( parece la magia negra más profunda para mí: P pero sigue siendo un +1 por rareza
masterX244
@ masterX244 He detallado un poco las entrañas. HTH
JB
1

sh / nmap / GNU grep / xargs - 36

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

Sigue las especificaciones de entrada y salida:

$ sh 1109.sh 127.0.0.1 1 80
22 25 80
Arnaud Le Blanc
fuente
2
No sé si nmapcuenta como una respuesta válida aquí, pero definitivamente no lo es sh:)
Eelvex
El formato de salida también podría usar un poco de pulido.
JB
2
@Eelvex es un script sh, con una your-port-scanner host_ip startPort endPortinterfaz, llamando a nmap ;-)
Arnaud Le Blanc
@JB, hecho :-) __
Arnaud Le Blanc
no nmapvienen equipados con Linux? : - \ No sabía que ... :(
st0le
1

Rubí - 85

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

BASH - 105

En BASH puro (es decir, no nmap o netcat).

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

Cuando se usa con una dirección que no sea localhost, el tiempo de espera es bastante largo (en el orden de minutos) cuando se encuentra con un puerto cerrado, por lo que probablemente se requerirá algún tipo de función de tiempo de espera / alarma.

JOgden
fuente
0

PHP - 70

<?for(list(,$h,$p,$e)=$argv;$p<=$e;++$p)@fsockopen($h,$p)&&print"$p ";
Arnaud Le Blanc
fuente
Estoy seguro de que puede exprimir la $p++otra mención de $p, ahorrará un char ...
st0le
0

Perl, 178

Soy nuevo en Perl, cualquier consejo sobre acortamiento es apreciado.

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
fuente