Quali sono le alternative per controllare le porte aperte, oltre a telnet?


24

Possiamo usare quanto segue per testare la porta VIA telnet; nell'esempio seguente testiamo la porta 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Dato che su alcune macchine non possiamo usare telnet (per motivi interni) quali sono le alternative per controllare le porte, come telnet?


Perl è un'opzione?
Jeff Schaller

5
Questi "motivi interni" potrebbero impedirti di utilizzare altri software di scansione delle porte. Conoscevo un ragazzo che lavorava in una banca e il suo contratto era stato risolto perché aveva una copia di nmap sul suo PC. Lo stava usando per scopi legati al lavoro, ma era nella lista proibita, quindi fu scortato fuori dall'edificio.
Roger Lipscombe,

2
Perl è un'opzione? - SÌ
yael

2
Si noti che telnet è un protocollo sofisticato. L' telnetutilità disattiva il comportamento del protocollo se viene fornita una porta dalla riga di comando. Quindi si comporta in modo molto simile netcat, solo con il rilevamento della fine della linea.
rexkogitans,

Una domanda più agnostica del sistema operativo, che non suggerisce nemmeno la scansione delle porte, è unix.stackexchange.com/questions/499694 .
JdeBP,

Risposte:


23

Se si utilizza Bash Shell, è possibile utilizzare la sua funzionalità per verificare se una porta è aperta o chiusa:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Se il server non risponde dopo 1 secondo, viene raggiunto il timeout, i comandi vengono 'interrotti e quindi non viene stampato nulla.


5
Forse dovresti usare il nome host della domanda (kafka02) invece di 127.0.0.1, il che fa sembrare che funzioni solo con il loopback.
Dmitry Grigoryev il

1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullnon stampa niente per me. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullha funzionato come previsto (stampa PORTA CHIUSA). Nota la posizione di '.
thararpy

cosa ottieni su bash -c '</ dev / tcp / kafka01 / 6667'
yael

quindi eco $? (se 0 allora la porta è aperta,)
yael

IIRC questa funzione bash era disabilitata in Debian qualche tempo fa. È un trucco accurato ma non sempre funziona.
AnonymousLurker,

32

netcat è un'opzione.

nc -zv kafka02 6667
  • -z = imposta nc per scansionare semplicemente i demoni in ascolto, senza in realtà inviare alcun dato a loro
  • -v = abilita la modalità dettagliata

è possibile ottenere l'output standard dal nc? perché voglio scrivere nel mio script bash
yael

2
Leggi la documentazione! Senza opzioni ncsi comporta molto come telnet.
Henrik - smetti di ferire Monica il

si ho letto i documenti ma -w flag non funziona come timeout
yael

esempio - c -v -w 1 kafka01 6667 (non otteniamo il timeout)
yael

nc -v -w 3 kafka01 6667 Ncat: versione 6.40 ( nmap.org/ncat ) Ncat: collegato a 10.164.235.85:6667. (questo ancora si blocca)
yael

23

Il gold standard è senza dubbio nmap( nmap.org ), ma in genere richiede root per "i migliori risultati". Tuttavia, sono disponibili file binari autonomi ed è possibile eseguirlo come utente non privilegiato, solo con funzionalità degradate. Ad esempio, invece di una synscansione invisibile ( -sS), ricade in una scansione di connessione TCP standard ( -sT). Questo è funzionalmente equivalente a netcat, ma con le belle capacità multi-host e velocizzate che ha.

Un esempio:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

1
nella maggior parte delle organizzazioni nmap è considerato come uno strumento di scansione e non è possibile utilizzare nmap senza un'adeguata autorizzazione. Anche se si tratta di un'istanza EC2, è richiesta anche l'autorizzazione da AWS.
al mamun,

4

Se Perl è un'opzione, è possibile utilizzare il suo IO::Socketmodulo per testare una connessione a un host e una porta particolari; lo script sotto TCP hard-code come protocollo (che è quello che Telnet userebbe):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Esempio di output da una porta chiusa:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Esempio di output da una porta aperta:

$ ./above-script kafka02 4200
Success!

2

File dispositivo / dev / tcp e / dev / udp possono essere usati al posto di telnet. Esempio: echo 0> /dev/tcp/103.64.35.86/6667. Quindi controlla lo stato di uscita usando #echo $? . Se lo stato di uscita è 0, la porta è aperta. Se lo stato di uscita è diverso da zero, la porta viene chiusa. Per controllare i pacchetti udp, utilizzare echo 0> /dev/udp/103.64.35.86/6667.


nel mio redhat 7 sotto / dev /, non abbiamo tcp
yael

ls / dev / tcp / ls: impossibile accedere a / dev / tcp /: nessun file o directory del genere
yael

su quale sistema operativo lo testate?
yael

@yael, non otterrai / dev / tcp o / dev / udp mentre ls. prova lo stesso comando sulla tua shell e otterrai il risultato. a proposito, lo uso spesso su RHEL6,7
al mamun

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.