Come ottengo le porte su cui un processo è in ascolto usando python? Il pid del processo è noto.Come ottenere le porte su cui un processo è in ascolto?
risposta
È possibile utilizzare netstat -lnp
, l'ultima colonna conterrà pid e nome processo. In Python puoi analizzare l'output di questo comando.
Se non si desidera analizzare l'output di un programma come netstat o lsof, è possibile eseguire l'analisi tramite il file system/proc e cercare di trovare la documentazione sui file all'interno. /proc/<pid>/net/tcp
potrebbe essere particolarmente interessante per te. Naturalmente, il formato di questi file potrebbe cambiare tra versioni del kernel, quindi l'output del comando parsing è generalmente considerato più affidabile.
Ci sono due parti per la mia risposta:
1. Ottenere le informazioni nel guscio
Per la prima parte, netstat
avrebbe funzionato, ma io preferisco usare lsof
, dal momento che può essere utilizzato per estrarre un elenco più informativo e conciso. Le opzioni precise da utilizzare può variare in base alla OS, kernel e compilazione opzioni, ma credo che si desidera qualcosa di simile:
lsof -a -p23819 -i4
Dove 23819
è il PID si sta selezionando per, e i4
denota tutti i socket IPv4 (sebbene tu possa volere i6
per IPv6, a seconda dei casi). Da lì, puoi passare attraverso grep per selezionare solo i socket di ascolto.
lsof -a -p23819 -i4 | grep LISTEN
(In lsof
versione 4.82, è possibile inoltre utilizzare il flag -sTCP:LISTEN
invece di grep
per selezionare i socket di ascolto, anche se questa opzione non sembra essere disponibile di nuovo nella versione 4,78)
2. chiamata lsof
da Python
Si dovrebbe essere in grado di chiamare lsof
e leggere l'output, da Python, utilizzando il modulo subprocess
, in questo modo:
from subprocess import Popen, PIPE
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE)
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
Spero che questo aiuti!
È possibile utilizzare psutil:
>>> import psutil
>>> p = psutil.Process(2549)
>>> p.name()
'proftpd: (accepting connections)'
>>> p.connections()
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
... Per filtrare per prese di ascolto:
>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN]
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')]
>>>
Una cosa che non è stata menzionata. La maggior parte delle applicazioni port in python utilizza un argomento della riga di comando. È possibile analizzare/proc/pid/cmdline e analizzare il numero di porta. Questo evita il sovraccarico dell'utilizzo di ss o netstat sui server con un sacco di connessioni.
- 1. Come posso ottenere la porta su cui è in ascolto un servizio WCF?
- 2. Ascolto di porte COM seriali in uso
- 3. Ascolto di più porte da un server
- 4. Determinare il processo PID in ascolto su una determinata porta
- 5. Come cercare le porte COM in C#?
- 6. È possibile ottenere l'output di un processo
- 7. In che modo boost.asio rileva su quale porta è in ascolto la mia app del server?
- 8. Come ottenere l'oggetto View su cui è stata avviata l'animazione ......?
- 9. Come ottenere BACKLOG della presa di ascolto
- 10. Rilascio delle porte associate all'uscita del processo
- 11. Come ottenere il PID di un processo che viene convogliato su un altro processo in Bash?
- 12. Iptables inoltra l'intervallo di porte su un altro intervallo di porte su un host diverso
- 13. Come ottengo le porte aperte da un servizio di Windows?
- 14. Ascolto di onChange su un datepicker jQuery?
- 15. Dropwizard - risorse su più porte
- 16. Node.js Come ottenere l'indirizzo IP del server http in ascolto su una porta specifica
- 17. Come pubblicare le porte nei file docker
- 18. Quale PID è in ascolto su una determinata porta Mach
- 19. Come ottenere l'esatto indirizzo IP del server Restify in ascolto?
- 20. Come ignorare le porte di output con le mappe delle porte
- 21. Ascolto onClick su un'immagine ListView - Android
- 22. Come ottenere il percorso di un processo in Unix/Linux
- 23. mongodb riconfigurare le porte shard
- 24. È un processo in esecuzione su una macchina remota?
- 25. Nessun endpoint in ascolto su net.pipe: // localhost/
- 26. Come uccidere un processo senza ottenere un'eccezione di "processo terminato"?
- 27. GMail SMTP via C#. Errori netti su tutte le porte
- 28. Esecuzione del server Tomcat su due porte diverse
- 29. Come trovare le porte COM disponibili?
- 30. Come ospitare WCF tramite le porte TCP?
Grazie. psutil è un buon modulo. Ma l'unico problema è che l'utilizzo del modulo richiede che sia installato prima. E l'installazione di psutil richiede l'installazione di header gcc e python. Quindi il progetto che usa psutil sarebbe difficile da installare. – mtoloo
psutil ha bisogno di gcc perché contiene codice C che deve essere compilato. Non direi che sia così difficile da installare, specialmente su Linux. Su Ubuntu, ad esempio, devi semplicemente "apt-get install python-dev" e "pip install psutil" e il gioco è fatto. –