Controlla lo stato di una porta sull'host remoto [chiuso]


158

Ho bisogno di una riga di comando in grado di controllare lo stato della porta su un host remoto. Ho provato ping xxx.xxx.xxx.xxx:161ma non riconosce l '"host". Ho pensato che fosse una "buona" risposta fino a quando non ho fatto lo stesso comando contro un host che so che ha aperto quella porta. Questo è per un file batch su Windows che controllerà lo stato della porta remota, quindi eseguirà un comando che utilizza quella porta remota per informazioni, quindi di nuovo il comando di controllo della porta remota, quindi il comando che utilizza quella porta sul server successivo per informazioni , e così via. Ho cercato dappertutto e ho pensato che il ping potesse farlo, ma ci devono essere varie versioni di ping, suppongo che il server su cui sto facendo questo non mostri questa opzione.

Solo per le risate, ho provato un controllo della porta remota basato sul web da un sito Web - e i risultati erano corretti sia per il server "problem" che per il server corretto. Tuttavia, non posso usarlo in un'esecuzione batch con oltre 500 IP server.

C'è qualcosa che posso fare che è semplice? Le mie abilità in Perl sono estremamente arrugginite (usalo o perdilo), non conosco altre lingue basate su Windows tranne il batch. Unix è la mia abilità, ma deve essere eseguita da Widows Server 2003.


5
Potresti provare a chiedere questo a serverfault.com
John Rasch il


1
Poiché questa domanda è chiusa, ho risposto qui
npocmaka,


windows ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan,

Risposte:


151

Sembra che tu stia cercando uno scanner di porte come nmap o netcat , entrambi disponibili per Windows, Linux e Mac OS X.

Ad esempio, controlla telnet su un ip noto:

nmap -A 192.168.0.5/32 -p 23

Ad esempio, cerca porte aperte da 20 a 30 su host.example.com:

nc -z host.example.com 20-30

Entrambi sono disponibili per Windows.
Glenn,

1
il tuo comando nmap dovrebbe davvero "-p23" senza lo spazio. nmap tratta ogni unità non immediatamente preceduta da una bandiera come destinazione di scansione separata
Brandon Lebedev,

14
dovrebbe essere nc -zv host.example.com 20-30. in caso contrario non vi è alcun output
Aryeh Beitz,

1
L'opzione -zper ncnon è disponibile su Linux.
valentin_nasta,

1
@valentin_nasta sì, lo è, forse a seconda della versione di netcat in uso (gnu o openbsd). Ecco la linea pertinente dalla pagina man per nc (versione openbsd) sul mio sistema Linux Arch: -z Specifica che nc deve semplicemente cercare i demoni in ascolto, senza inviare alcun dato. È un errore usare questa opzione insieme all'opzione -l
pgoetz

126

Nel Prompt dei comandi, è possibile utilizzare il comando telnet. Ad esempio, per connettersi a IP 192.168.10.1 con la porta 80,

telnet 192.168.10.1 80

Per abilitare telnet in Windows 7 e versioni successive fare clic su . Dall'articolo collegato, abilitare telnet tramite il pannello di controllo -> programmi e funzionalità -> funzionalità di windows -> client telnet, o semplicemente eseguirlo in un prompt di amministrazione:

dism /online /Enable-Feature /FeatureName:TelnetClient

3
Questo è il metodo più semplice se telnet è installato sul dispositivo Windows
shonky linux user

30
... e ci vogliono 2 secondi per aggiungerlo a Windows (8.1 nel mio caso)> Pannello di controllo> Aggiungi programmi> Attiva le funzionalità di Windows
Chris Moutray

14
Solo per informazioni: se la porta non è aperta: Connessione a ##### ... Impossibile aprire la connessione all'host, sulla porta ####: Connessione non riuscita; E se la porta è aperta, finirai in telnet (CTRL +], quindi "esci")
blackstrype

27

A scopi di scripting, ho scoperto che il curlcomando può farlo, ad esempio:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Forse potrebbe non funzionare per tutti i servizi, poiché curlin alcuni casi potrebbe restituire codici di errore diversi (come da commento), pertanto l'aggiunta della seguente condizione potrebbe funzionare in modo affidabile:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Nota: aggiunto -m5per impostare un timeout di connessione massimo di 5 secondi.

Se si desidera verificare anche se l'host è valido, è necessario verificare anche il 6codice di uscita:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Per risolvere il codice di errore restituito, eseguire semplicemente:, curl host:portad esempio:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Vedi: man curlper l'elenco completo dei codici di uscita.


Purtroppo questo non funziona per me (almeno su bash in OS X).
Mike Atlas,

1
Un servizio personalizzato FWIW funziona in un certo senso: curl $IP:$PORTproduce: curl: (52) Empty reply from server(contro curl: (7) Failed to connect) ma molto simile nc, non posso | grep Emptyper queste dichiarazioni di output come ci si potrebbe aspettare (qualcosa su newline o mancanza di output immediato?). Presumo che la tua linea sia condizionale in base al codice di uscita, giusto? Sono su El Cap; forse in altre versioni o sistemi operativi lo stato di errore viene chiuso -1anziché 52?
Mike Atlas

Sì, lo farebbe. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas,

La domanda riguardava Windows, che ovviamente non ha eg / dev / null
Arthur Tacca il

@ArthurTacca È sempre possibile utilizzare il sottosistema Windows per Linux (WSL).
Kenorb,

23

Premere Windows+ Rtipo cmdeEnter

Nel prompt dei comandi digitare

telnet "machine name/ip" "port number"

Se la porta non è aperta, questo messaggio visualizzerà:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

Altrimenti verrai portato alla porta aperta (verrà visualizzato lo schermo vuoto)


7
Si noti che telnet non è installato per impostazione predefinita sui moderni sistemi Windows. Dovrai installarlo dal pannello di controllo Aggiungi / Rimuovi funzionalità di Windows.
Greg

1
@Greg o usando uno strumento online come telnet-online.net
oz

2
@oz true, a meno che non si verifichi lo stato di un server interno
Greg

funziona su Windows10
gaurav,

19

Usa il comando nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Puoi anche usare il comando telnet

telnet <ip/host> port

4

nc o 'netcat' ha anche una modalità di scansione che può essere utile.


3
Su Mac "nc -zv server port-range"
Vijay Kumar,

2

Penso che tu stia cercando Hping ( http://www.hping.org/ ), che ha una versione per Windows.

"L'interfaccia è ispirata al comando unix ping (8), ma hping non è solo in grado di inviare richieste di eco ICMP. Supporta TCP, UDP, ICMP ..."

È anche molto utile se vuoi vedere dove lungo una rotta viene bloccata una porta TCP (come da un firewall), dove ICMP potrebbe non essere.


2

In Bash, è possibile utilizzare file pseudo-dispositivo che possono aprire una connessione TCP al socket associato. La sintassi è /dev/$tcp_udp/$host_ip/$port.

Ecco un semplice esempio per verificare se Memcached è in esecuzione:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Ecco un altro test per vedere se un sito Web specifico è accessibile:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Per ulteriori informazioni, consultare: Guida avanzata di script Bash: capitolo 29. /deve/proc .

Correlati: verifica se una porta su un sistema remoto è raggiungibile (senza telnet) su SuperUser.

Per altri esempi, vedere: Come aprire un socket TCP / UDP in una shell bash (articolo).


1
Wow, questo è geniale! Non so che sia possibile solo bash. Così conveniente per le persone come me che hanno solo git bash installato su Windows e non vogliono installare un altro servizio.
dotslashlu,
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.