En Python, existe-t-il un moyen d'envoyer une requête ping à un serveur via ICMP et de renvoyer TRUE si le serveur répond, ou FALSE s'il n'y a pas de réponse?
python
python-3.x
ping
icmp
Kudu
la source
la source
Réponses:
Cette fonction fonctionne dans n'importe quel système d'exploitation (Unix, Linux, macOS et Windows)
Python 2 et Python 3
EDITS:
Par @radato a
os.system
été remplacé parsubprocess.call
. Cela évite la vulnérabilité d' injection de shell dans les cas où votre chaîne de nom d'hôte pourrait ne pas être validée.Notez que, selon @ikrase sous Windows, cette fonction reviendra toujours
True
si vous obtenez uneDestination Host Unreachable
erreur.Explication
La commande est
ping
à la fois dans les systèmes Windows et Unix.L'option
-n
(Windows) ou-c
(Unix) contrôle le nombre de paquets qui dans cet exemple a été défini sur 1.platform.system()
renvoie le nom de la plateforme. Ex.'Darwin'
sur macOS.subprocess.call()
effectue un appel système. Ex.subprocess.call(['ls','-l'])
.la source
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Code: modifiez la dernière ligne du code Python enreturn system_call(command)
. Avec une connectivité appropriée, vous obtiendrez 0 (zéro). Avec votre modem éteint, vous devez obtenir un code d'erreur. Bien entendu, les deux méthodes doivent renvoyer le même code d'erreur dans les mêmes conditions.Si vous n'avez pas besoin de prendre en charge Windows, voici une façon très concise de le faire:
Cela fonctionne car le ping renvoie une valeur différente de zéro si la connexion échoue. (La valeur de retour diffère en fait en fonction de l'erreur réseau.) Vous pouvez également modifier le délai d'expiration du ping (en secondes) à l'aide de l'option «-t». Notez que cela affichera du texte sur la console.
la source
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
pour être sûr.hostname
chaîne d'un utilisateur, il pourrait facilement pirater votre serveur en vous donnant une "URL" comme'google.com; rm -rf /*'
. Utilisezsubprocess.run(["ping", "-c", "1", hostname]).returncode
plutôt.Il existe un module appelé pyping qui peut le faire. Il peut être installé avec pip
Il est assez simple à utiliser, cependant, lorsque vous utilisez ce module, vous avez besoin d'un accès root car il crée des paquets bruts sous le capot.
la source
os.system('ping -c 1 -t 1 hostname')
solution. De plus, lapyping
bibliothèque est très facile à utiliser par rapport à l'utilisation de la bibliothèque de sockets TCP / IP. J'ai écrit mon programme ping en utilisant les deux, et ilpyping
est beaucoup plus rapide et plus facile à utiliser, à mon avis, surtout si l'on n'est pas familier avec l'utilisation de la bibliothèque de sockets TCP / IP.pip install ping3
la source
whereis ping
pour obtenir le chemin correct.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Pour python3, il existe un module python ping3 très simple et pratique : (
pip install ping3
, nécessite les privilèges root ).Ce module permet également la personnalisation de certains paramètres.
la source
Parce que j'aime avoir mon programme Python universel sur les versions 2.7 et 3.x et sur les plateformes Linux, Mac OS et Windows, j'ai dû modifier les exemples existants.
la source
False if platform.system().lower()=="windows" else True
vous pouvez bien sûr également utiliserplatform.system().lower() != "windows"
.os.name!="nt"
marche pas aussi? Certes, je ne l'ai pas essayé sur tous les combos ver / plateforme!def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
unreachable
se trouve dans le tube, non?Après avoir regardé autour de moi, j'ai fini par écrire mon propre module ping, conçu pour surveiller un grand nombre d'adresses, est asynchrone et n'utilise pas beaucoup de ressources système. Vous pouvez le trouver ici: https://github.com/romana/multi-ping/ Il est sous licence Apache, vous pouvez donc l'utiliser dans votre projet comme bon vous semble.
Les principales raisons de la mise en œuvre de la mienne sont les restrictions des autres approches:
la source
la source
Assurez-vous que pyping est installé ou installez-le pip install pyping
la source
Le ping ICMP programmatique est compliqué en raison des privilèges élevés requis pour envoyer des paquets ICMP bruts, et l'appel
ping
binaire est moche. Pour la surveillance du serveur, vous pouvez obtenir le même résultat en utilisant une technique appelée ping TCP :En interne, cela établit simplement une connexion TCP au serveur cible et la supprime immédiatement, en mesurant le temps écoulé. Cette implémentation particulière est un peu limitée en ce qu'elle ne gère pas les ports fermés, mais pour vos propres serveurs, cela fonctionne plutôt bien.
la source
la source
Je résous ceci avec:
"TTL" est le moyen de savoir si le ping est correctement. Saludos
la source
Ma réduction en utilisant les idées des réponses dans cet article, mais uniquement en utilisant le nouveau module de sous-processus recommandé et python3:
la source
True if condition else False
pour renvoyer True ou False en fonction d'une condition. Il suffit d'utiliser egshell_needed = operating_sys == 'Windows'
etreturn success == 0
Ce script fonctionne sur Windows, et devrait fonctionner sur d'autres OS: Il fonctionne sur Windows, Debian et macosx, nécessite un test sur solaris.
la source
J'ai fini par trouver cette question concernant un scénario similaire. J'ai essayé le pyping mais l'exemple donné par Naveen n'a pas fonctionné pour moi sous Windows sous Python 2.7.
Un exemple qui a fonctionné pour moi est:
la source
pyping
ne semble pas être un module standard. Peut-être pourriez-vous fournir un lien?En utilisant Multi-ping (
pip install multiPing
), j'ai créé ce code simple ( copiez et collez simplement si vous voulez! ):Usage:
Si vous voulez un seul échantillon, le deuxième paramètre "
10
" peut être ignoré!J'espère que ça aide!
la source
Ma version d'une fonction ping:
N'hésitez pas à l'utiliser comme vous le souhaitez.
la source
Cela semble assez simple, mais m'a donné des crises. J'ai continué à obtenir "l'opération de socket ouverte icmp n'est pas autorisée" ou bien les solutions se bloqueraient si le serveur était hors ligne. Si, cependant, vous voulez savoir que le serveur est actif et que vous exécutez un serveur Web sur ce serveur, alors curl fera le travail. Si vous avez ssh et des certificats, alors ssh et une simple commande suffiront. Voici le code:
la source
J'avais une exigence similaire, je l'ai donc implémentée comme indiqué ci-dessous. Il est testé sur Windows 64 bits et Linux.
Lorsque l'adresse IP n'est pas accessible, subprocess.check_output () lève une exception. Une vérification supplémentaire peut être effectuée en extrayant les informations de la ligne de sortie «Paquets: envoyés = 2, reçus = 2, perdus = 0 (0% de perte)».
la source
Voici une solution utilisant le
subprocess
module Python et l'ping
outil CLI fourni par le système d'exploitation sous-jacent. Testé sous Windows et Linux. Prise en charge de la définition d'un délai d'expiration du réseau. N'a pas besoin de privilèges root (au moins sur Windows et Linux).la source
Utilisez ceci, il est testé sur python 2.7 et fonctionne correctement, il renvoie le temps de ping en millisecondes en cas de succès et renvoie False en cas d'échec.
la source
Une chose que beaucoup de réponses manquent est que (au moins sous Windows) la
ping
commande renvoie 0 (indiquant le succès) si elle reçoit la réponse «Hôte de destination inaccessible».Voici mon code qui vérifie s'il
b'TTL='
est dans la réponse, car cela n'est présent que lorsque le ping a atteint l'hôte. Remarque: la plupart de ce code est basé sur les autres réponses ici.Remarque: Cela capture la sortie au lieu de l'imprimer, donc si vous voulez voir la sortie de
ping
, vous devrez imprimercompletedPing.stdout
avant de revenir.la source
WINDOWS UNIQUEMENT - Je ne peux pas croire que personne ne s'est ouvert Win32_PingStatus En utilisant une simple requête WMI, nous renvoyons un objet rempli d'informations très détaillées gratuitement
sortie d'échantillon
la source
Mon emprunt à d'autres réponses. Essayez de simplifier et de minimiser les requêtes.
la source
J'avais besoin d'un balayage de ping plus rapide et je ne voulais pas utiliser de bibliothèques externes, j'ai donc résolu d'utiliser la concurrence en utilisant intégré
asyncio
.Ce code nécessite python 3.7+ et est fabriqué et testé sous Linux uniquement . Cela ne fonctionnera pas sous Windows, mais je suis sûr que vous pouvez facilement le modifier pour qu'il fonctionne sur Windows.
Je ne suis pas un expert avec
asyncio
mais j'ai utilisé cet excellent article Accélérez votre programme Python avec la concurrence et j'ai proposé ces lignes de codes. J'ai essayé de le rendre aussi simple que possible, vous devrez donc probablement y ajouter plus de code pour répondre à vos besoins.Il ne renvoie ni vrai ni faux, j'ai pensé qu'il serait plus pratique de lui faire imprimer l'adresse IP qui répond à une demande de ping. Je pense que c'est assez rapide, avec un ping de 255 ips en près de 10 secondes.
Exemple de sortie:
Notez que les adresses IP ne sont pas dans l'ordre, car l'adresse IP est imprimée dès qu'elle répond, donc celle qui répond en premier est imprimée en premier.
la source
Un simple que je viens de préparer en une minute ... en utilisant icmplib, il faut des privilèges root, le ci-dessous fonctionne plutôt bien! HTH
la source