risposta-alla-domanda-sullo-sviluppo-web-bd.com

Testare in modo efficiente se una porta è aperta su Linux?

Da uno script bash come posso scoprire rapidamente se una porta 445 è aperta/in ascolto su un server.

Ho provato un paio di opzioni, ma voglio qualcosa di veloce:
1. lsof -i :445 (richiede pochi secondi)
2. netstat -an |grep 445 |grep LISTEN (richiede pochi secondi)
3. telnet (non restituisce)
4. nmap, netcat non sono disponibili sul server

Sarà bello sapere un modo che non enumera prima e greps dopo.

186
Aman Jain

Una sorpresa che ho scoperto di recente è che Bash supporta nativamente connessioni TCP come descrittori di file . Usare:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

Sto usando 6 come descrittore di file perché 0,1,2 sono stdin, stdout e stderr. 5 è talvolta usato da Bash per i processi figli , quindi 3,4,6,7,8 e 9 dovrebbero essere sicuri.

Come da commento qui sotto, per verificare l'ascolto su un server locale in uno script:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

Per determinare se qualcuno è in ascolto, provare a connettersi tramite loopback. Se fallisce, la porta viene chiusa o non è consentito l'accesso. Successivamente, chiudi la connessione.

Modifica questo per il tuo caso d'uso, ad esempio l'invio di un messaggio di posta elettronica, l'uscita dallo script in caso di errore o l'avvio del servizio richiesto.

151
Spencer Rathbun

C'è molto breve con "risposta veloce" qui: Come testare se la porta remota TCP è aperta dallo script di Shell?

$ nc -z <Host> <port>; echo $?

Lo uso con 127.0.0.1 come indirizzo "remoto".

102
user2187128

Puoi usare netstat in questo modo per risultati molto più veloci:

Su Linux:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Su Mac:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Questo produrrà un elenco di processi in ascolto sulla porta (445 in questo esempio) o non genererà nulla se la porta è libera.

89
anubhava

Puoi usare netcat per questo.

nc ip port < /dev/null

si connette al server e chiude nuovamente la connessione. Se netcat non è in grado di connettersi, restituisce un codice di uscita diverso da zero. Il codice di uscita è memorizzato nella variabile $ ?. Come esempio,

nc ip port < /dev/null; echo $?

restituirà 0 se e solo se netcat potrebbe connettersi correttamente alla porta.

36
Tony

sono elencati in/proc/net/tcp.

è la seconda colonna, dopo ":", in esadecimale:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

quindi immagino che uno di quei :50 nella terza colonna debba essere stackoverflow: o)

guarda in man 5 proc per maggiori dettagli. e scegliendolo separatamente con sed etc viene lasciato come esercizio per il gentile lettore ...

15
andrew cooke

Basato sulla risposta di Spencer Rathbun, usando bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
13
user1338062
ss -tl4 '( sport = :22 )'

2 ms è abbastanza veloce?

Aggiungi i due punti e questo funziona su Linux

11
leucos

Volevo controllare se una porta è aperta su uno dei nostri server di prova linux. Sono stato in grado di farlo provando a connetterti con telnet dalla mia macchina di sviluppo al server di test. Su te dev machine prova a eseguire:

$ telnet test2.Host.com 8080
Trying 05.066.137.184...
Connected to test2.Host.com

In questo esempio voglio controllare se la porta 8080 è aperta su Host test2.Host.com

5
razvang
nc -l 8000

Dove 8000 è il numero di porta. Se la porta è libera, avvierà un server che è possibile chiudere facilmente. In caso contrario, genererà un errore:

nc: Address already in use
5
Jose Enrique

Ecco uno che funziona sia per Mac che per Linux:

netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
5
Artur Bodera

tcping è un ottimo strumento con un overhead molto basso. Ha anche un argomento di timeout per renderlo più veloce:

[[email protected]_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[[email protected]_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[[email protected]_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.
1
Payam

Puoi anche usare il comando netcat

[location of netcat]/netcat -zv [ip] [port]

o

nc -zv [ip] [port]

-z - imposta nc per cercare semplicemente i daemon in ascolto, senza realmente inviare loro alcun dato.
- v - abilita la modalità dettagliata.

0
Saurabh