sviluppo-web-qa.it

Come faccio a sapere se una porta è disponibile su Ubuntu 8.04?

C'è qualche comando che posso eseguire da bash che mi dirà se una porta è già aperta?

28
Codebeef

Utilizzare "netstat" per verificare le porte attualmente in uso.

netstat -antp 
 
 Proto Recv-Q Send-Q Indirizzo locale Indirizzo esterno Stato PID/Nome programma 
 tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* ASCOLTA 16297/nominato 
 Tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* ASCOLTA 16297/chiamato 
 Tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0: * ASCOLTA 16297/denominato 
 Tcp 0 0 127.0.0.1:53 0.0.0.0:* ASCOLTA 16297/nominato 
37
Caterpillar

Questo (netstat) è la soluzione più veloce ...

netstat -lnt

... ma questo ti dà più controllo (a costo della velocità (a volte molta velocità)) ...

lsof -n -i -a -u www-data

L'esempio sopra riportato mostra ad esempio tutte le TCP aperte e nello stato LISTEN, AND (-a) appartenente ad Apache (www-data) utente.

13
Xerxes

Tutte buone risposte.

Tuttavia, non menzionare se si è connessi al computer in questione. ; P

In caso contrario, nmap è tuo amico.

per cominciare provate:

nmap -Otarget

amap è anche una buona scelta che tenterà anche di indovinare il software del server afferrando le pagine dei banner.

per cominciare provate:

amaptarget1-6000

8
Matthew

Provare

lsof -i :<port number>

Se si ottengono risultati, qualcosa è in ascolto e associato, ad es

# lsof -i :80
COMMAND   PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx    1833 nobody    3u  IPv4 51091229      0t0  TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED)
nginx    1833 nobody    5u  IPv4 46221856      0t0  TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT)
nginx    1833 nobody    9u  IPv4 34733048      0t0  TCP localhost.localdomain:http (LISTEN)
nginx    1833 nobody   10u  IPv4 34733049      0t0  TCP odessa.cheney.net:http (LISTEN)
nginx    1833 nobody   14u  IPv4 46221857      0t0  TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT)
nginx    1833 nobody   15u  IPv4 51091030      0t0  TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED)
nginx   11832   root    9u  IPv4 34733048      0t0  TCP localhost.localdomain:http (LISTEN)
nginx   11832   root   10u  IPv4 34733049      0t0  TCP odessa.cheney.net:http (LISTEN)
7
Dave Cheney
netstat -tlnp  

Mostra tcp porte che sono listening, mostra solo numbers (non risolvi i nomi - rende più veloce) e mostra il processo p che sta eseguendo in ascolto (p funziona solo se sei root)

netstat -ulnp  

Mostra udp porte che sono listening, mostra solo numbers (non risolvi i nomi - rende più veloce) e mostra il processo p che sta eseguendo in ascolto (p funziona solo se sei root)

netstat -unp  

Mostra udp porte aperte ma non in ascolto, mostra solo numbers (non risolvi i nomi, rende più veloce) e mostra il processo p che sta ascoltando ( p funziona solo se sei root)

netstat -an

Mostra all porte in uso, mostra solo numbers - non risolvere i nomi

lsof -i <proto>@<Host>:<port>

per esempio

lsof -i [email protected]:25

per vedere se qualcosa è in ascolto sulla porta localhost 25/TCP o

lsof -i [email protected]:636 

per verificare se sono presenti prese locali o remote in ascolto (locale) o connesse (locale o remoto) per qualsiasi host/interfaccia

4
Jason Tan

lsof (elenca i file aperti) è un buon strumento per vedere se un processo è in ascolto su una porta

lsof -P | grep: <numero-port>

netstat è un buon strumento per vedere se ci sono connessioni attive.

netstat -n | grep: <numero-port>

2
Jamie

Uso fusore (nel pacchetto psmisc):

fuser -n tcp PORT

Riporta il pid del processo associato a questa porta.

Se questo è per sapere se una porta è in ascolto, il buon vecchio telnet fa il trucco :)

telnet 127.0.0.1 PORT

2
Oct

Non menzionate quale protocollo volete usare, cioè TCP o UDP - ed è anche importante rendervi conto che "port" non è così granulare che il sistema supporta per disambiguare i socket. se il sistema ha più indirizzi IP, la porta 80 potrebbe essere in uso su tutti gli indirizzi IP (l'applicazione è stata associata a "0.0.0.0" o "::" o a ciascun indirizzo IP in successione) oppure potrebbe essere in uso solo su un sottoinsieme di quegli indirizzi IP.

Il modo migliore e più sicuro per determinare se una porta/indirizzo è libero e disponibile è tentare di vincolarlo. Netcat è utile per questo.

nc -l [-s a.b.c.d] -p NN

tenterà di collegarsi a TCP porta NN attiva (facoltativo, il valore predefinito sarà tutti gli indirizzi) a.b.c.d. Aggiungi l'opzione -u per fare lo stesso in UDP.

Successivamente, per sapere se la porta è veramente "aperta" come richiesto, è necessario iniziare a esaminare le potenziali regole del firewall. Ancora una volta la cosa più semplice è provare a connettersi alla porta. Utilizzare netcat come sopra, sul server e da un client utilizzare netcat per tentare di connettersi alla porta aperta.

nc [-u] a.b.c.d NN

si collegherà alla porta NN su a.b.c.d, usando UDP se viene specificato il flag -u. È quindi possibile digitare l'input nell'estremità del client, che dovrebbe essere visualizzato sul server. In caso contrario, è necessario esaminare gli strumenti specifici del sistema e della rete.

2
colmmacc

Questo one-liner ti fornirà un elenco di tutte le TCP porte in uso. Funziona bash su Ubuntu e OS X.

netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq

L'elenco avrà una porta per riga senza ulteriori informazioni.

2
Josiah Johnston

Un sacco di modi per farlo mi ha dato problemi perché non funzionavano su Linux e OSX e/o perché non mostravano le porte utilizzate dalla finestra mobile o i processi che erano di proprietà di root. Ora uso solo questo programma javascript:

(assicurati di avere il nodo installato e che funzioni con node non solo nodejs o modifica il programma di conseguenza)

salva quanto segue in un file chiamato check-port nel tuo percorso o nel tuo progetto

#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
  process.exit(0)
});

impostare le autorizzazioni

chmod +x path/to/check-port

corri dal tuo percorso

check-port 8080

o eseguire dalla stessa directory

./check-port 8080

finora funziona abbastanza bene.

0
Alex028502