পাইথনে সার্ভারগুলি পিং করছে


167

পাইথনে, আইসিএমপি-এর মাধ্যমে কোনও সার্ভারকে পিং করার এবং সার্ভারের প্রতিক্রিয়া হলে সত্য ফেরত দেওয়ার কোনও উপায় আছে, বা কোনও প্রতিক্রিয়া না থাকলে FALSE?


উত্তর:


112

এই ফাংশনটি কোনও ওএস (ইউনিক্স, লিনাক্স, ম্যাকস এবং উইন্ডোজ)
পাইথন 2 এবং পাইথন 3 এ কাজ করে

সম্পাদনাগুলি:
দ্বারা @radato os.system দ্বারা প্রতিস্থাপিত হয় subprocess.call। আপনার হোস্টনাম স্ট্রিংটি বৈধতা না দেওয়া হতে পারে এমন ক্ষেত্রে এটি শেল ইনজেকশন দুর্বলতা এড়ায়।

import platform    # For getting the operating system name
import subprocess  # For executing a shell command

def ping(host):
    """
    Returns True if host (str) responds to a ping request.
    Remember that a host may not respond to a ping (ICMP) request even if the host name is valid.
    """

    # Option for the number of packets as a function of
    param = '-n' if platform.system().lower()=='windows' else '-c'

    # Building the command. Ex: "ping -c 1 google.com"
    command = ['ping', param, '1', host]

    return subprocess.call(command) == 0

মনে রাখবেন, উইন্ডোজে @ ক্রেজ অনুসারে আপনি কোনও ত্রুটি Trueপেলে এই ফাংশনটি এখনও ফিরে আসবে Destination Host Unreachable

ব্যাখ্যা

কমান্ডটি pingউভয় উইন্ডোজ এবং ইউনিক্স-মতো সিস্টেমে রয়েছে।
বিকল্প -n(উইন্ডোজ) বা -c(ইউনিক্স) প্যাকেটের সংখ্যা নিয়ন্ত্রণ করে যা এই উদাহরণে 1 তে সেট করা হয়েছিল।

platform.system()প্ল্যাটফর্মের নাম ফেরত দেয়। যাত্রা। 'Darwin'ম্যাকোজে
subprocess.call()একটি সিস্টেম কল সম্পাদন করে। যাত্রা। subprocess.call(['ls','-l'])


14
মনে রাখবেন যে আপনি যদি অন্য কোনও হোস্টের থেকে "গন্তব্য হোস্টটি অ্যাক্সেসযোগ্য" উত্তর পান তবে এটি এখনও সত্য (উইন্ডোজে) ফিরে আসবে।
ikrase

আমি আবিষ্কার করছি যে আমার মডেম বন্ধ হয়ে গেলে আমি মাঝে মধ্যে পিং সাফল্য পাব ??? এটি একটি উইন্ডোজ 10 OS এ "8.8.8.8" এবং "google.com" পরীক্ষা করছে। কিছু ঠিক মত হয় না।
মার্কাস

@ মারকাস এটি হতে পারে না। দয়া করে, হাতের দ্বারা এবং উপরের কোডটির একটি পরিবর্তিত সংস্করণ দিয়ে পরীক্ষা করুন এবং ফলাফলটি আমাদের জানান। হাতে: 1) ওপেন সিএমডি 2) ping 8.8.8.8 -n 13) echo %ERRORLEVEL%। কোড: পাইথন কোডের শেষ লাইনটি এতে সংশোধন করুন return system_call(command)। সঠিক সংযোগের সাথে আপনি 0 (শূন্য) পাবেন। আপনার মডেম বন্ধ হওয়ার সাথে সাথে আপনাকে কিছু ত্রুটি কোড অবশ্যই পাওয়া উচিত। অবশ্যই, উভয় পদ্ধতিতে একই শর্তে একই ত্রুটি কোডটি ফেরত দিতে হবে।
ePi272314

এটি ঘটেছিল এবং আমি শব্দটির জন্য সঠিক কোড, শব্দটি ব্যবহার করছিলাম। আমি আপনার মন্তব্যগুলি বুঝতে এবং বিশ্বাস করি, কোনও সংযোগ না থাকলে কমান্ড লাইন পিং সফল হওয়ার কোনও উপায় নেই, তাই আমার ধারণা হয়েছিল যে কিছু অজগরটিতে কমান্ড লাইন অপারেশনটি সঠিকভাবে কাজ করছে না। আমি আপডেটটি চেষ্টা করে দেখব কীভাবে এটি হয়। ধন্যবাদ।
মার্কাস

@ মারকাস ইক্রেজের মন্তব্য দেখুন।
বরিস

163

আপনার যদি উইন্ডোজ সমর্থন করার প্রয়োজন না হয় তবে এটি করার জন্য এখানে একটি সংক্ষিপ্ত উপায় রয়েছে:

import os
hostname = "google.com" #example
response = os.system("ping -c 1 " + hostname)

#and then check the response...
if response == 0:
  print hostname, 'is up!'
else:
  print hostname, 'is down!'

এটি কাজ করে কারণ সংযোগ ব্যর্থ হলে পিং একটি শূন্য-অমূল্য প্রদান করে। (নেটওয়ার্ক ত্রুটির উপর নির্ভর করে রিটার্নের মানটি আসলে আলাদা হয়)) আপনি '-t' বিকল্পটি ব্যবহার করে পিং টাইমআউট (সেকেন্ডে) পরিবর্তনও করতে পারেন। দ্রষ্টব্য, এটি কনসোলে পাঠ্য আউটপুট দেবে।


42
আমি এই রূপটি দিয়ে শেষ করেছিresponse = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
এমজিপি

4
@ jeckyll2hide ম্যান পিং, সময়সীমা 2 সেকেন্ড সহ মাত্র 1 প্যাকেট প্রেরণ করুন এবং সমস্ত আউটপুটকে / dev / নালিতে পুনর্নির্দেশ করুন, কেবলমাত্র ফেরতের মানটি পাবেন।
এমজিপি

@ ম্যানুয়েলগুটিরেজ আমি মনে করি আপনি "-W 2000" (2000 মিলি সেকেন্ডের পরে টাইমআউট) এবং সম্ভবত "-t 3" (3 সেকেন্ড পরে প্রস্থান করুন, যাই হোক না কেন)
পরের দিন

1
-w এবং -W সেকেন্ডে মিলিসেকেন্ড নয় মান গ্রহণ করে। man pingনিশ্চিত করতে চেক করুন ।
অ্যালান টুরিং

7
আপনি যদি hostnameকোনও ব্যবহারকারীর কাছ থেকে স্ট্রিংটি পান তবে তারা সহজেই আপনাকে "ইউআরএল" পছন্দ করে আপনার সার্ভারটি হ্যাক করতে পারে 'google.com; rm -rf /*'subprocess.run(["ping", "-c", "1", hostname]).returncodeপরিবর্তে ব্যবহার করুন।
বরিস

38

পাইপিং নামে একটি মডিউল রয়েছে যা এটি করতে পারে। এটি পাইপের সাথে ইনস্টল করা যেতে পারে

pip install pyping

এটি ব্যবহার করা খুব সহজ, তবে, এই মডিউলটি ব্যবহার করার সময়, এটি হুডের নীচে কাঁচা প্যাকেট তৈরি করছে এই কারণে আপনার রুট অ্যাক্সেস প্রয়োজন।

import pyping

r = pyping.ping('google.com')

if r.ret_code == 0:
    print("Success")
else:
    print("Failed with {}".format(r.ret_code))

4
"নোট করুন যে আইসিএমপি বার্তাগুলি কেবল রুট হিসাবে চলমান প্রক্রিয়াগুলি থেকে পাঠানো যেতে পারে (উইন্ডোতে, আপনাকে অবশ্যই এই প্রশাসনিক প্রশাসক হিসাবে এই স্ক্রিপ্টটি চালাতে হবে)"।
বেন হাইড

1
আমি পছন্দ করি আপনি প্রেরিত আইসিএমপি অনুরোধের সময়সীমা এবং গণনা নির্দিষ্ট করতে পারবেন। আমি এমন একটি স্ক্রিপ্ট লিখতে সক্ষম হয়েছি যা স্থানীয় সাব-নেটে সমস্ত হোস্টকে আবিষ্কার করে। os.system('ping -c 1 -t 1 hostname')সমাধানটি 255 সেকেন্ডের পরিবর্তে 1 সেকেন্ডে কার্যকর করা হয় । প্লাস pypingটিসিপি / আইপি সকেট লাইব্রেরি তুলনায় তুলনামূলকভাবে ব্যবহার করা খুব সহজ। আমি আমার পিং প্রোগ্রাম দুটি ব্যবহার করে লিখেছি pypingএবং আমার মতে বিশেষভাবে যদি টিসিপি / আইপি সকেট লাইব্রেরি ব্যবহারের সাথে পরিচিত না হয় তবে তা আরও দ্রুত এবং ব্যবহার করা সহজ।
মাইকেই

10
পাই 3 দিয়ে কাজ করে না ModuleNotFoundError: 'কোর' নামে কোনও মডিউল নেই
alireza

2
'কোর' ত্রুটি পাইথন 3 এর সাথে বেমানান থেকে আসে। আমি পাইগন 3 এর জন্য এটি ঠিক করার চেষ্টা করেছি তবে এটি ক্রমাগত আমাকে ত্রুটিগুলি প্রেরণ করে চলে। লেখক এবং প্রকল্পগুলি গিথুব পৃষ্ঠাটি নিচে (404 পাওয়া যায় নি)। আমাদের এটিকে পাইথন
আন্দ্রে

6
পাইথন pip install ping3
বীপ_চেক করুন

29
import subprocess
ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "192.168.0.1"], stdout=subprocess.PIPE).stdout.read()

6
এটির সাথে একমাত্র সমস্যাটি হ'ল এটি উইন্ডোজে কাজ করবে না।
কুডু

8
এটি উল্লেখ করা উচিত যে এর মতো কিছু প্রয়োজনীয় হওয়ার কারণটি হ'ল আইসিএমপি-র মূলের প্রয়োজন, এবং / বিন / পিং এসইউআইডি সেট হয়ে এটির কাছাকাছি যায়।
ক্যাটসকুল

1
দ্রষ্টব্য: পিং অন্য কোনও স্থানে থাকলে ব্যর্থ হতে পারে। whereis pingসঠিক পথ পেতে ব্যবহার করুন ।
octern

4
এটি উইন্ডোজে কাজ করে:ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
ভিক্টর লেলিস

1
উইন্ডোজটিতে প্রতিক্রিয়াটি ঠিক আছে বা কো ছিল কিনা তা পরীক্ষা করতে আমি কীভাবে ফলাফলকে পার্স করতে পারি?
পিট্টো

15

পাইথন 3 এর জন্য খুব সাধারণ এবং সুবিধাজনক পাইথন মডিউল পিং 3 রয়েছে : ( pip install ping3, রুট সুবিধার দরকার আছে)।

from ping3 import ping, verbose_ping
ping('example.com')  # Returns delay in seconds.
>>> 0.215697261510079666

এই মডিউলটি পাশাপাশি কিছু পরামিতিগুলির স্বনির্ধারণের অনুমতি দেয় allows


2
সম্পাদনায় যেমন মূল অধিকার প্রয়োজন, এটি এখানে তুলে নেওয়ার বিষয়ে আলোচনা করুন: github.com/kyan001/ping3/issues/10
Dimitrios Mistriotis

1
ওহ, কেবল ইনস্টলের জন্যই নয়, মৃত্যুদন্ড কার্যকর করার জন্যও মূল উদ্দীপনা দরকার: পিং ("উদাহরণ.com")
ঘড়িয়াঘাং

14

যেহেতু আমি আমার পাইথন প্রোগ্রামটি সংস্করণ ২.7 এবং ৩.x এবং প্ল্যাটফর্ম লিনাক্স, ম্যাক ওএস এবং উইন্ডোজে সর্বজনীন রাখতে চাই, আমাকে বিদ্যমান উদাহরণগুলি সংশোধন করতে হয়েছিল।

# shebang does not work over all platforms
# ping.py  2016-02-25 Rudolf
# subprocess.call() is preferred to os.system()
# works under Python 2.7 and 3.4
# works under Linux, Mac OS, Windows

def ping(host):
    """
    Returns True if host responds to a ping request
    """
    import subprocess, platform

    # Ping parameters as function of OS
    ping_str = "-n 1" if  platform.system().lower()=="windows" else "-c 1"
    args = "ping " + " " + ping_str + " " + host
    need_sh = False if  platform.system().lower()=="windows" else True

    # Ping
    return subprocess.call(args, shell=need_sh) == 0

# test call
print(ping("192.168.17.142"))

1
আপনার পরিবর্তে False if platform.system().lower()=="windows" else Trueঅবশ্যই কেবল ব্যবহার করতে পারে platform.system().lower() != "windows"
ফ্রিরিচ রাবাব

os.name!="nt"কাজও করে না ? স্বীকারোক্তিপূর্ণভাবে আমি এটি সমস্ত ভার্চ / প্ল্যাটফর্ম কম্বোতে চেষ্টা করে দেখিনি!
কেইলি

2
আমার ক্ষেত্রে ডিফল্ট গেটওয়েটি একটি 'অ্যাক্সেসযোগ্য' বার্তা দেয়, তবে উইন্ডোজ পিং কমান্ডটিতে এখনও 0 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
টির

@ ওয়েলস্পোকেনম্যান আপনি বরং 0 টি ফিরে পাবেন যদি unreachableপাইপে পাওয়া যায়, না?
মৌমাছি

1
@ বীব হ্যাঁ আমি এটিও করেছি তবে মন্তব্যটি আপডেট করতে ভুলে গেছি। আমার বর্তমান ফাংশনটি এর মতো দেখাচ্ছে: পেস্টবিন.
com

8

আশেপাশে দেখার পরে, আমি আমার নিজের পিং মডিউলটি লিখে শেষ করেছি, যা বিপুল সংখ্যক ঠিকানা নিরীক্ষণের জন্য ডিজাইন করা হয়েছে, অ্যাসিঙ্ক্রোনাস এবং প্রচুর সিস্টেম সংস্থান ব্যবহার করে না। আপনি এটি এখানে খুঁজে পেতে পারেন: https://github.com/romana/m Multi-ping/ এটি অ্যাপাচি লাইসেন্সযুক্ত, যাতে আপনি এটি উপযুক্ত দেখতে যে কোনও উপায়ে আপনার প্রকল্পে এটি ব্যবহার করতে পারেন।

আমার নিজের প্রয়োগের মূল কারণগুলি হল অন্যান্য পদ্ধতির সীমাবদ্ধতা:

  • এখানে উল্লিখিত বেশিরভাগ সমাধানের জন্য কমান্ড লাইন ইউটিলিটিতে এক্সিকিউট দরকার হয়। আপনার যথেষ্ট সংখ্যক আইপি ঠিকানা নিরীক্ষণের প্রয়োজন হলে এটি যথেষ্ট অদক্ষ এবং ক্ষুধার্ত সংস্থান।
  • অন্যরা কিছু পুরানো পাইথন পিং মডিউল উল্লেখ করে। আমি সেগুলির দিকে চেয়েছিলাম এবং শেষ পর্যন্ত, তাদের সবার কিছু না কিছু সমস্যা রয়েছে বা অন্যটি (যেমন সঠিকভাবে প্যাকেট আইডি সেট না করা) এবং বিপুল সংখ্যক ঠিকানার পিং-ইনিং পরিচালনা করতে পারেনি।

চমৎকার কাজের সাথী! যদি কেউ এটিকে ক্রিয়াতে
Cucu

7
#!/usr/bin/python3

import subprocess as sp

def ipcheck():
    status,result = sp.getstatusoutput("ping -c1 -w2 " + str(pop))
    if status == 0:
        print("System " + str(pop) + " is UP !")
    else:
        print("System " + str(pop) + " is DOWN !")


pop = input("Enter the ip address: ")
ipcheck()

এই কোডটিতে প্রশ্নের উত্তর থাকতে পারে তবে আপনার কোড কীভাবে সমস্যাটি সমাধান করছে সে সম্পর্কে কিছু মন্তব্য বা ব্যাখ্যা যুক্ত করা সহায়ক হবে।
skrrgwasme

5

নিশ্চিত করুন পাইপিং ইনস্টল রয়েছে বা এটি পাইপ ইনস্টল পাইপিং ইনস্টল করুন

#!/usr/bin/python
import pyping

response = pyping.ping('Your IP')

if response.ret_code == 0:
    print("reachable")
else:
    print("unreachable")

1
ধন্যবাদ! তবে এটিকে কাজ করতে আমাকে এই কোডটি রুট হিসাবে চালানো দরকার।
থমাস

1
পাইপিংয়ের গিটহাব পৃষ্ঠাটি আর বিদ্যমান নেই এবং পাইপিআই প্যাকেজটি
২০১

আমি ত্রুটিগুলি পেয়েছি: পাইপিং আমদানি করুন ট্রেসব্যাক (সর্বশেষতম কল): ফাইল "<stdin>", লাইন 1, <মডুল> ফাইল "/usr/local/lib/python3.6/dist-packages/pyping/__init__ এ। পাই ", লাইন 3, <আমদানি> মূল আমদানি থেকে * মডিউল নটফাউন্ড এরিয়ার: 'কোর' নামে কোনও মডিউল নেই
ক্লক

5

কাঁচা আইসিএমপি প্যাকেট প্রেরণের জন্য প্রয়োজনীয় উন্নত সুবিধার কারণে প্রোগ্রামেটিক আইসিএমপি পিং জটিল, এবং pingবাইনারি কল করা কুৎসিত। সার্ভার পর্যবেক্ষণের জন্য, আপনি টিসিপি পিং নামক একটি কৌশল ব্যবহার করে একই ফলাফল অর্জন করতে পারেন :

# pip3 install tcping
>>> from tcping import Ping
# Ping(host, port, timeout)
>>> ping = Ping('212.69.63.54', 22, 60)
>>> ping.ping(3)
Connected to 212.69.63.54[:22]: seq=1 time=23.71 ms
Connected to 212.69.63.54[:22]: seq=2 time=24.38 ms
Connected to 212.69.63.54[:22]: seq=3 time=24.00 ms

অভ্যন্তরীণভাবে, এটি সহজ টার্গেট সার্ভারের সাথে একটি টিসিপি সংযোগ স্থাপন করে এবং অবিলম্বে এটি ড্রপ করে সময় ব্যয় করে পরিমাপ করে। এই নির্দিষ্ট বাস্তবায়নটি কিছুটা সীমাবদ্ধ যে এটি বন্ধ বন্দরগুলি পরিচালনা করে না তবে আপনার নিজের সার্ভারের জন্য এটি বেশ ভালভাবে কাজ করে।


4
#!/usr/bin/python3

import subprocess as sp

ip = "192.168.122.60"
status,result = sp.getstatusoutput("ping -c1 -w2 " + ip)

if status == 0: 
    print("System " + ip + " is UP !")
else:
    print("System " + ip + " is DOWN !")

3

আমি এটি দিয়ে সমাধান করি:

def ping(self, host):
    res = False

    ping_param = "-n 1" if system_name().lower() == "windows" else "-c 1"

    resultado = os.popen("ping " + ping_param + " " + host).read()

    if "TTL=" in resultado:
        res = True
    return res

"টিটিএল" হল পিংটি সঠিকভাবে আছে কিনা তা জানার উপায়। Saludos


3

এই পোস্টে উত্তরগুলি থেকে ধারণাগুলি ব্যবহার করে তবে কেবলমাত্র নতুন প্রস্তাবিত সাবপ্রসেসি মডিউল এবং পাইথন 3 ব্যবহার করে আমার হ্রাস:

import subprocess
import platform

operating_sys = platform.system()
nas = '192.168.0.10'

def ping(ip):
    # ping_command = ['ping', ip, '-n', '1'] instead of ping_command = ['ping', ip, '-n 1'] for Windows
    ping_command = ['ping', ip, '-n', '1'] if operating_sys == 'Windows' else ['ping', ip, '-c 1']
    shell_needed = True if operating_sys == 'Windows' else False

    ping_output = subprocess.run(ping_command,shell=shell_needed,stdout=subprocess.PIPE)
    success = ping_output.returncode
    return True if success == 0 else False

out = ping(nas)
print(out)

1
True if condition else Falseশর্তের ভিত্তিতে সত্য বা মিথ্যা ফেরত দেওয়ার জন্য আপনাকে ব্যবহার করার দরকার নেই । স্রেফ উদাহরণস্বরূপ shell_needed = operating_sys == 'Windows'এবংreturn success == 0
ইমোরিস

2

এই স্ক্রিপ্টটি উইন্ডোজে কাজ করে এবং অন্যান্য ওএসে কাজ করা উচিত: এটি উইন্ডোজ, ডেবিয়ান এবং ম্যাকোক্সে কাজ করে, সোলারিসের উপর একটি পরীক্ষা প্রয়োজন।

import os
import platform


def isUp(hostname):

    giveFeedback = False

    if platform.system() == "Windows":
        response = os.system("ping "+hostname+" -n 1")
    else:
        response = os.system("ping -c 1 " + hostname)

    isUpBool = False
    if response == 0:
        if giveFeedback:
            print hostname, 'is up!'
        isUpBool = True
    else:
        if giveFeedback:
            print hostname, 'is down!'

    return isUpBool

print(isUp("example.com")) #Example domain
print(isUp("localhost")) #Your computer
print(isUp("invalid.example.com")) #Unresolvable hostname: https://tools.ietf.org/html/rfc6761
print(isUp("192.168.1.1")) #Pings local router
print(isUp("192.168.1.135")) #Pings a local computer - will differ for your network

ভাল উত্তর. উইন্ডোজের জন্য এখানে প্রশাসকের কোনও অধিকারের প্রয়োজন নেই।
মাউন্টেন

সত্যই কি ভুল উভয়
আইপিই যেভাবেই পাচ্ছি

হ্যাঁ এটি অবশ্যই কাজ করে না।
সবেমাত্র

2

আমি একই প্রশ্নে এই প্রশ্নটি সন্ধান করে শেষ করেছি। আমি পাইপিং চেষ্টা করেছিলাম কিন্তু নবীন যে উদাহরণটি দিয়েছেন তা পাইথন ২.7 এর অধীনে উইন্ডোজে আমার পক্ষে কার্যকর হয়নি।

একটি উদাহরণ যা আমার পক্ষে কাজ করেছে তা হ'ল:

import pyping

response = pyping.send('Your IP')

if response['ret_code'] == 0:
    print("reachable")
else:
    print("unreachable")

1
pypingমানক মডিউল হিসাবে উপস্থিত হয় না। সম্ভবত আপনি একটি লিঙ্ক প্রদান করতে পারে?
মাওগ বলছেন মনিকা

2

মাল্টি-পিং ব্যবহার করে ( pip install multiPing) আমি এই সাধারণ কোডটি তৈরি করেছি ( কেবল আপনি অনুলিপি করে কপি করুন এবং পেস্ট করুন! ):

from multiping import MultiPing

def ping(host,n = 0):
    if(n>0):
        avg = 0
        for i in range (n):
            avg += ping(host)
        avg = avg/n
    # Create a MultiPing object to test hosts / addresses
    mp = MultiPing([host])

    # Send the pings to those addresses
    mp.send()

    # With a 1 second timout, wait for responses (may return sooner if all
    # results are received).
    responses, no_responses = mp.receive(1)


    for addr, rtt in responses.items():
        RTT = rtt


    if no_responses:
        # Sending pings once more, but just to those addresses that have not
        # responded, yet.
        mp.send()
        responses, no_responses = mp.receive(1)
        RTT = -1

    return RTT

ব্যবহার:

#Getting the latency average (in seconds) of host '192.168.0.123' using 10 samples
ping('192.168.0.123',10)

আপনি যদি একটি একক নমুনা চান তবে দ্বিতীয় পরামিতি " 10" এড়ানো যাবে!

আশা করি এটা সাহায্য করবে!


4
দুর্দান্ত লাইব্রেরি, তবে মূল সুবিধার দরকার।
ক্রেনিক ক্যা

2

পিং ফাংশনের আমার সংস্করণ:

  • পাইথন 3.5 এবং তারপরে উইন্ডোজ এবং লিনাক্সে (ম্যাকের সাথে কাজ করা উচিত, তবে এটি পরীক্ষা করতে পারে না) কাজ করে।
  • উইন্ডোজে, পিং কমান্ড "গন্তব্য হোস্ট অলাপযোগ্য" এর সাথে ব্যর্থ হলে মিথ্যা ফিরিয়ে দেয়।
  • এবং কোনও পপ-আপ উইন্ডো বা কমান্ড লাইনে কোনও আউটপুট প্রদর্শন করে না।
import platform, subprocess

def ping(host_or_ip, packets=1, timeout=1000):
    ''' Calls system "ping" command, returns True if ping succeeds.
    Required parameter: host_or_ip (str, address of host to ping)
    Optional parameters: packets (int, number of retries), timeout (int, ms to wait for response)
    Does not show any output, either as popup window or in command line.
    Python 3.5+, Windows and Linux compatible (Mac not tested, should work)
    '''
    # The ping command is the same for Windows and Linux, except for the "number of packets" flag.
    if platform.system().lower() == 'windows':
        command = ['ping', '-n', str(packets), '-w', str(timeout), host_or_ip]
        # run parameters: capture output, discard error messages, do not show window
        result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, creationflags=0x08000000)
        # 0x0800000 is a windows-only Popen flag to specify that a new process will not create a window.
        # On Python 3.7+, you can use a subprocess constant:
        #   result = subprocess.run(command, capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW)
        # On windows 7+, ping returns 0 (ok) when host is not reachable; to be sure host is responding,
        # we search the text "TTL=" on the command output. If it's there, the ping really had a response.
        return result.returncode == 0 and b'TTL=' in result.stdout
    else:
        command = ['ping', '-c', str(packets), '-w', str(timeout), host_or_ip]
        # run parameters: discard output and error messages
        result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        return result.returncode == 0

এটি আপনি নির্দ্বিধায় ব্যবহার করুন।


1

যথেষ্ট সহজ মনে হচ্ছে, তবে আমাকে ফিট করে। আমি "আইসিএমপি ওপেন সকেট অপারেশনটির অনুমতি নেই" পেতে থাকি অন্যথায় সার্ভার লাইন বন্ধ থাকলে সমাধানগুলি স্থগিত হয়ে যায়। তবে, আপনি যদি জানতে চান যে সার্ভারটি বেঁচে আছে এবং আপনি সেই সার্ভারে একটি ওয়েব সার্ভার চালাচ্ছেন, তবে কার্লটি কাজটি করবে। আপনার যদি ssh এবং শংসাপত্র থাকে, তবে ssh এবং একটি সাধারণ কমান্ডই যথেষ্ট। কোডটি এখানে:

from easyprocess import EasyProcess # as root: pip install EasyProcess
def ping(ip):
    ping="ssh %s date;exit"%(ip) # test ssh alive or
    ping="curl -IL %s"%(ip)      # test if http alive
    response=len(EasyProcess(ping).call(timeout=2).stdout)
    return response #integer 0 if no response in 2 seconds

1

আমার অনুরূপ প্রয়োজনীয়তা ছিল তাই আমি এটি নীচের মত দেখিয়েছি implemented এটি উইন্ডোজ bit৪ বিট এবং লিনাক্সে পরীক্ষা করা হয়।

import subprocess
def systemCommand(Command):
    Output = ""
    Error = ""     
    try:
        Output = subprocess.check_output(Command,stderr = subprocess.STDOUT,shell='True')
    except subprocess.CalledProcessError as e:
        #Invalid command raises this exception
        Error =  e.output 

    if Output:
        Stdout = Output.split("\n")
    else:
        Stdout = []
    if Error:
        Stderr = Error.split("\n")
    else:
        Stderr = []

    return (Stdout,Stderr)

#in main
Host = "ip to ping"
NoOfPackets = 2
Timeout = 5000 #in milliseconds
#Command for windows
Command = 'ping -n {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
#Command for linux 
#Command = 'ping -c {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
Stdout,Stderr = systemCommand(Command)
if Stdout:
   print("Host [{}] is reachable.".format(Host))
else:
   print("Host [{}] is unreachable.".format(Host))

যখন আইপি পৌঁছনীয় নয় সাব-প্রসেসকসিচ_আউটপুট () একটি ব্যতিক্রম উত্থাপন করে। আউটপুট লাইন 'প্যাকেটগুলি: পাঠানো = 2, প্রাপ্ত = 2, হারানো = 0 (0% ক্ষতি)' থেকে তথ্য বের করে অতিরিক্ত যাচাইকরণ করা যেতে পারে।


1

পাইথনের subprocessমডিউল এবং pingঅন্তর্নিহিত ওএস দ্বারা সরবরাহিত সিএলআই সরঞ্জাম ব্যবহার করে এখানে একটি সমাধান রয়েছে । উইন্ডোজ এবং লিনাক্স পরীক্ষিত। একটি নেটওয়ার্ক সময়সীমা নির্ধারণ সমর্থন। রুট সুবিধার দরকার নেই (কমপক্ষে উইন্ডোজ এবং লিনাক্সে)।

import platform
import subprocess

def ping(host, network_timeout=3):
    """Send a ping packet to the specified host, using the system "ping" command."""
    args = [
        'ping'
    ]

    platform_os = platform.system().lower()

    if platform_os == 'windows':
        args.extend(['-n', '1'])
        args.extend(['-w', str(network_timeout * 1000)])
    elif platform_os in ('linux', 'darwin'):
        args.extend(['-c', '1'])
        args.extend(['-W', str(network_timeout)])
    else:
        raise NotImplemented('Unsupported OS: {}'.format(platform_os))

    args.append(host)

    try:
        if platform_os == 'windows':
            output = subprocess.run(args, check=True, universal_newlines=True).stdout

            if output and 'TTL' not in output:
                return False
        else:
            subprocess.run(args, check=True)

        return True
    except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
        return False

0

এটি ব্যবহার করুন এটি অজগর ২. tested এ পরীক্ষা করা হয়েছে এবং এটি সফলভাবে কাজ করে যদি সাফল্য এবং ব্যর্থ হলে মিথ্যা ফিরিয়ে দেয় তবে এটি মিলি সেকেন্ডে পিং সময় দেয়।

import platform,subproccess,re
def Ping(hostname,timeout):
    if platform.system() == "Windows":
        command="ping "+hostname+" -n 1 -w "+str(timeout*1000)
    else:
        command="ping -i "+str(timeout)+" -c 1 " + hostname
    proccess = subprocess.Popen(command, stdout=subprocess.PIPE)
    matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL)
    if matches:
        return matches.group(1)
    else: 
        return False

0

উত্তরগুলি মিস করার একটি বিষয় হ'ল (অন্তত উইন্ডোজে) the ping কমান্ডটি 0 (সাফল্যের ইঙ্গিত) দেয় যদি উত্তরটি পাওয়া যায় "গন্তব্য হোস্টটি অ্যাক্সেসযোগ্য"।

এখানে আমার কোড যা b'TTL='প্রতিক্রিয়াতে আছে কিনা তা যাচাই করে , যেহেতু পিংটি হোস্টের কাছে পৌঁছালেই তা উপস্থিত থাকে। দ্রষ্টব্য: এই কোডটির বেশিরভাগই এখানে অন্য উত্তরগুলির উপর ভিত্তি করে।

import platform
import subprocess

def ping(ipAddr, timeout=100):
    '''
    Send a ping packet to the specified host, using the system ping command.
    Accepts ipAddr as string for the ping destination.
    Accepts timeout in ms for the ping timeout.
    Returns True if ping succeeds otherwise Returns False.
        Ping succeeds if it returns 0 and the output includes b'TTL='
    '''
    if platform.system().lower() == 'windows':
        numFlag = '-n'
    else:
        numFlag = '-c'
    completedPing = subprocess.run(['ping', numFlag, '1', '-w', str(timeout), ipAddr],
                                   stdout=subprocess.PIPE,    # Capture standard out
                                   stderr=subprocess.STDOUT)  # Capture standard error
    # print(completedPing.stdout)
    return (completedPing.returncode == 0) and (b'TTL=' in completedPing.stdout)

print(ping('google.com'))

দ্রষ্টব্য: এটি আউটপুট এটি মুদ্রণের পরিবর্তে ক্যাপচার করে, সুতরাং আপনি যদি আউটপুট দেখতে চান তবে আপনাকে ফিরে আসার আগে pingমুদ্রণ করতে হবে completedPing.stdout


0

কেবল উইন্ডোজ - বিশ্বাস করতে পারছেন না কোনও উইন্ডোজ ফ্রি ফাটল Win32_PingStatus একটি সাধারণ ডাব্লুএমআই ক্যোয়ারী ব্যবহার করে আমরা নিখরচায় সত্যিকারের বিস্তারিত তথ্যে পূর্ণ একটি বস্তু ফিরিয়ে দিই

import wmi


# new WMI object
c = wmi.WMI()

# here is where the ping actually is triggered
x = c.Win32_PingStatus(Address='google.com')

# how big is this thing? - 1 element
print 'length x: ' ,len(x)


#lets look at the object 'WMI Object:\n'
print x


#print out the whole returned object
# only x[0] element has values in it
print '\nPrint Whole Object - can directly reference the field names:\n'
for i in x:
    print i



#just a single field in the object - Method 1
print 'Method 1 ( i is actually x[0] ) :'
for i in x:
    print 'Response:\t', i.ResponseTime, 'ms'
    print 'TTL:\t', i.TimeToLive


#or better yet directly access the field you want
print '\npinged ', x[0].ProtocolAddress, ' and got reply in ', x[0].ResponseTime, 'ms'

নমুনা আউটপুট


0

আমার অন্যান্য উত্তর থেকে ধার নেওয়া। প্রশ্নগুলি সহজতর করার ও হ্রাস করার চেষ্টা করুন।

import platform, os

def ping(host):
    result = os.popen(' '.join(("ping", ping.param, host))).read()
    return 'TTL=' in result

ping.param = "-n 1" if platform.system().lower() == "windows" else "-c 1"

0

আমার একটি দ্রুত পিং সুইপ দরকার এবং আমি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করতে চাই না, তাই আমি অন্তর্নির্মিত ব্যবহার করে কনকুরঞ্জি ব্যবহার করার সংকল্প করেছি asyncio

এই কোডটির জন্য অজগর 3.7+ প্রয়োজন এবং এটি কেবল লিনাক্সে তৈরি এবং পরীক্ষিত হয় । এটি উইন্ডোজে কাজ করবে না তবে আমি নিশ্চিত আপনি উইন্ডোজে কাজ করার জন্য এটি সহজেই পরিবর্তন করতে পারবেন।

আমি এর সাথে বিশেষজ্ঞ asyncioনই তবে আমি এই দুর্দান্ত নিবন্ধটি কনকিউরেন্সির সাথে আপনার পাইথন প্রোগ্রামটির গতি বাড়িয়েছি বাড়িয়েছি এবং এই কোডগুলির লাইন নিয়ে এসেছি। আমি এটিকে যতটা সম্ভব সহজ করার চেষ্টা করেছি, তাই সম্ভবত আপনার প্রয়োজন অনুসারে আপনাকে আরও কোড যুক্ত করতে হবে।

এটি সত্য বা মিথ্যা প্রত্যাবর্তন করে না, আমি ভেবেছিলাম যে এটি কেবল পিংয়ের অনুরোধে সাড়া দেয় এমন আইপি প্রিন্ট করা আরও সুবিধাজনক হবে। আমি মনে করি এটি প্রায় দ্রুত, প্রায় 10 সেকেন্ডের মধ্যে 255 আইপস পিং করছে ।

#!/usr/bin/python3

import asyncio

async def ping(host):
    """
    Prints the hosts that respond to ping request
    """
    ping_process = await asyncio.create_subprocess_shell("ping -c 1 " + host + " > /dev/null 2>&1")
    await ping_process.wait()

    if ping_process.returncode == 0:
        print(host)
    return 


async def ping_all():
    tasks = []

    for i in range(1,255):
        ip = "192.168.1.{}".format(i)
        task = asyncio.ensure_future(ping(ip))
        tasks.append(task)

    await asyncio.gather(*tasks, return_exceptions = True)

asyncio.run(ping_all())

নমুনা আউটপুট:

192.168.1.1
192.168.1.3
192.168.1.102
192.168.1.106
192.168.1.6

মনে রাখবেন যে আইপিগুলি যথাযথ নয়, আইপি যেমন উত্তর দেওয়ার সাথে সাথে মুদ্রণ করা হয়, তাই যে প্রথমে সাড়া দেয় সে প্রথমে মুদ্রিত হয়।


-3
  1 #!/usr/bin/python
  2
  3 import os
  4 import sys
  5 import time
  6
  7 os.system("clear")
  8 home_network = "172.16.23."
  9 mine = []
 10
 11 for i in range(1, 256):
 12         z =  home_network + str(i)
 13         result = os.system("ping -c 1 "+ str(z))
 14         os.system("clear")
 15         if result == 0:
 16                 mine.append(z)
 17
 18 for j in mine:
 19         print "host ", j ," is up"

একটি সাধারণ যা আমি স্রেফ এক মিনিটে রান্না করে রেখেছি..আইসিম্পলিবের নীচে রুট প্রাইভেসের প্রয়োজন খুব ভাল কাজ করে! আছে HTH

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.