Dans la traduction des scripts de Bash, je rencontre de nombreuses utilisations de Netstat -an -an pour trouver si l'un de nos services est écouté. Bien que je sache, je ne peux qu'utiliser simplement sous-processus.Call ou autre pop même populaire, je préférerais utiliser une solution pythonique, donc je ne tire pas en train de tirer parti de l'environnement UNIX que nous opérons. P>
De ce que j'ai lu le module de socket devrait avoir quelque chose, mais je n'ai rien vu qui vérifie les ports d'écoute. Cela pourrait ne pas comprendre un tour simple, mais je sais jusqu'à présent comment se connecter à une prise et écrire quelque chose qui me permet de savoir quand cette connexion a échoué. Mais pas nécessairement, j'ai trouvé quelque chose qui vérifie spécifiquement le port pour voir si son écoute. P>
Des idées? P>
6 Réponses :
Que diriez-vous d'essayer de se connecter ...
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex(('127.0.0.1', 3306))
if result == 0:
print('socket is open')
s.close()
Je ne pense pas que cela soit suffisant. Il vous dit que quelque chose i> écoute, mais cela pourrait être n'importe quoi, pas nécessairement le processus que vous attendez.
Richardw Comment allez-vous élaborer à ce sujet?
Vous pouvez soit essayer de se connecter au port en question, soit émuler Faire ce dernier sera spécifique au système d'exploitation. Sur Linux, vous pouvez examiner Vous recherchez des lignes netstat code>. / proc / net / tcp code>. Il ressemble à ceci: p> 0A code> dans le st code> ("statut" ) colonne. Les chiffres après le côlon dans local_address code> - c809 code>, 16cc code> etc. sont des numéros de port TCP (en hex) sur lesquels il existe des processus d'écoute . p> p>
sur Linux, nous pouvons utiliser une strace pour voir que netstat -ln lit et
analysant diverses valeurs du système de fichiers / proc. afin que vous puissiez simplement lire ces fichiers de python et extraire les données que vous avez
BESOIN. P> $ sudo ls -l /proc/522/fd
total 0
lrwx------ 1 root root 64 2011-09-15 21:32 0 -> /dev/null
lrwx------ 1 root root 64 2011-09-15 21:32 1 -> /dev/null
lrwx------ 1 root root 64 2011-09-15 21:32 2 -> /dev/null
lrwx------ 1 root root 64 2011-09-15 21:32 3 -> socket:[6456]
lrwx------ 1 root root 64 2011-09-15 21:32 4 -> socket:[6458]
Je sais que cette question est vieille, mais j'écris ceci pour les débutants. Si vous souhaitez identifier les ports d'écoute de votre système, vous pouvez utiliser le code ci-dessous.
import psutil connections = psutil.net_connections() Reference: https://stackoverflow.com/a/6244270
Je sais que je suis plusieurs années de retard, mais les réponses existantes sont suffisamment bonnes.
J'étais sur Google à la recherche d'une bonne solution élégante pour exactement le même problème et les non des réponses déjà postées semblaient suffisamment bonnes, Au lieu de cela, j'ai trouvé des solutions de ma part et je veux les poster ici pour aider les futurs lecteurs qui sont redirigés ici par Google. p>
la plupart des systèmes d'exploitation ont un exécutable nommé Utilisation de plaine NetStat Code> sera très lent, car de la résolution du nom, à l'aide de in Python 3.9.6, utilisez alors la sortie doit ressembler à ceci: P> netstat code>, que Peut être utilisé pour capturer des ports d'écoute, dans cet exemple, j'utilise Windows 10 et Python 3.9.6 x64, mais c'est écrit Python afin que vous puissiez l'adapter facilement pour votre propre cas d'utilisation. P> netstat -n code> sera exponentiellement plus rapide car elle ne perdra pas le temps de résoudre les noms. P> SubProCes.run () code> Pour exécuter des appels OS et utilisez capture_output = true code> pour capturer stdout, puis utiliser .stdout Code> Propriété de Résultat P ROCESS Pour obtenir une sortie, le résultat est sous forme binaire, utilisez .decode () code> pour obtenir une chaîne. p> In [103]: %timeit set(i.laddr.port for i in psutil.net_connections())
893 µs ± 13.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)