Dalam Python, apakah ada cara untuk melakukan ping ke server melalui ICMP dan mengembalikan TRUE jika server merespons, atau SALAH jika tidak ada respons?
python
python-3.x
ping
icmp
Kudu
sumber
sumber
Jawaban:
Fungsi ini berfungsi di semua OS (Unix, Linux, macOS, dan Windows)
Python 2 dan Python 3
EDIT:
Oleh @radato
os.system
digantikan olehsubprocess.call
. Ini menghindari kerentanan injeksi shell jika string nama host Anda mungkin tidak divalidasi.Perhatikan bahwa, menurut @ikrase pada Windows, fungsi ini masih akan kembali
True
jika Anda mendapatkanDestination Host Unreachable
kesalahan.Penjelasan
Perintahnya ada
ping
di sistem Windows dan Unix-like.Opsi
-n
(Windows) atau-c
(Unix) mengontrol jumlah paket yang dalam contoh ini diatur ke 1.platform.system()
mengembalikan nama platform. Ex.'Darwin'
di macOS.subprocess.call()
melakukan panggilan sistem. Ex.subprocess.call(['ls','-l'])
.sumber
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Kode: Ubah baris terakhir kode Python menjadireturn system_call(command)
. Dengan konektivitas yang tepat Anda akan mendapatkan 0 (nol). Dengan modem Anda mati, Anda harus mendapatkan beberapa kode kesalahan. Tentu saja, kedua metode harus mengembalikan kode kesalahan yang sama dalam kondisi yang sama.Jika Anda tidak perlu mendukung Windows, berikut ini cara yang sangat ringkas untuk melakukannya:
Ini berfungsi karena ping mengembalikan nilai bukan nol jika koneksi gagal. (Nilai pengembalian sebenarnya berbeda tergantung pada kesalahan jaringan.) Anda juga bisa mengubah batas waktu ping (dalam detik) menggunakan opsi '-t'. Catatan, ini akan menampilkan teks ke konsol.
sumber
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
untuk memastikan.hostname
string dari pengguna, mereka dapat dengan mudah meretas server Anda dengan memberi Anda "url"'google.com; rm -rf /*'
. Gunakansubprocess.run(["ping", "-c", "1", hostname]).returncode
sebagai gantinya.Ada modul yang disebut pyping yang dapat melakukan ini. Itu dapat diinstal dengan pip
Sangat mudah digunakan, namun, ketika menggunakan modul ini, Anda memerlukan akses root karena fakta bahwa itu adalah pembuatan paket mentah di bawah tenda.
sumber
os.system('ping -c 1 -t 1 hostname')
solusi. Pluspyping
lib sangat mudah digunakan dibandingkan dengan menggunakan perpustakaan soket TCP / IP. Saya menulis program ping saya menggunakan keduanya, danpyping
jauh lebih cepat dan lebih mudah digunakan, menurut pendapat saya, terutama jika orang tidak terbiasa dengan menggunakan perpustakaan soket TCP / IP.pip install ping3
sumber
whereis ping
untuk mendapatkan jalur yang benar.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Untuk python3 ada modul python ping3 yang sangat sederhana dan nyaman : (
pip install ping3
, membutuhkan hak akses root ).Modul ini memungkinkan penyesuaian beberapa parameter juga.
sumber
Karena saya suka memiliki program Python universal pada versi 2.7 dan 3.x dan pada platform Linux, Mac OS dan Windows, saya harus memodifikasi contoh yang ada.
sumber
False if platform.system().lower()=="windows" else True
tentunya Anda bisa juga menggunakan sajaplatform.system().lower() != "windows"
.os.name!="nt"
juga berfungsi? Memang saya belum mencobanya di semua kombo ver / platform!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
ditemukan di dalam pipa, bukan?Setelah melihat-lihat, saya akhirnya menulis modul ping saya sendiri, yang dirancang untuk memonitor sejumlah besar alamat, tidak sinkron dan tidak menggunakan banyak sumber daya sistem. Anda dapat menemukannya di sini: https://github.com/romana/multi-ping/ Ini berlisensi Apache, sehingga Anda dapat menggunakannya dalam proyek Anda dengan cara apa pun yang Anda inginkan.
Alasan utama untuk menerapkan saya sendiri adalah pembatasan dari pendekatan lain:
sumber
sumber
Pastikan pyping diinstal atau instal pip instal pyping
sumber
Ping ICMP terprogram rumit karena hak istimewa tinggi yang diperlukan untuk mengirim paket ICMP mentah, dan memanggil
ping
biner jelek. Untuk pemantauan server, Anda dapat mencapai hasil yang sama menggunakan teknik yang disebut TCP ping :Secara internal, ini hanya membuat koneksi TCP ke server target dan langsung menjatuhkannya, mengukur waktu yang berlalu. Implementasi khusus ini agak terbatas karena tidak menangani port yang tertutup tetapi untuk server Anda sendiri ia bekerja dengan cukup baik.
sumber
sumber
Saya menyelesaikan ini dengan:
"TTL" adalah cara untuk mengetahui apakah ping itu benar. Salud
sumber
Pengurangan saya menggunakan ide dari jawaban dalam posting ini tetapi hanya menggunakan modul subproses yang direkomendasikan dan python3 yang lebih baru:
sumber
True if condition else False
untuk mengembalikan Benar atau Salah berdasarkan kondisi. Cukup gunakan misshell_needed = operating_sys == 'Windows'
danreturn success == 0
Skrip ini berfungsi pada Windows, dan harus bekerja pada OS lain: Ini berfungsi pada Windows, Debian, dan macosx, perlu tes pada solaris.
sumber
Saya akhirnya menemukan pertanyaan ini mengenai skenario yang sama. Saya mencoba pyping tetapi contoh yang diberikan oleh Naveen tidak bekerja untuk saya di Windows di bawah Python 2.7.
Contoh yang berhasil bagi saya adalah:
sumber
pyping
tampaknya bukan modul standar. Mungkin Anda bisa memberikan tautan?Menggunakan Multi-ping (
pip install multiPing
) saya membuat kode sederhana ini ( cukup salin dan tempel jika mau! ):Pemakaian:
Jika Anda ingin sampel tunggal, "
10
" parameter kedua dapat diabaikan!Semoga ini bisa membantu!
sumber
Versi saya dari fungsi ping:
Jangan ragu untuk menggunakannya sesuka Anda.
sumber
Tampaknya cukup sederhana, tetapi memberi saya cocok. Saya terus mendapatkan "operasi soket terbuka icmp tidak diizinkan" atau solusi akan menutup jika server off line. Namun, jika yang ingin Anda ketahui adalah bahwa server masih hidup dan Anda menjalankan server web di server itu, maka curl akan melakukan pekerjaan itu. Jika Anda memiliki ssh dan sertifikat, maka ssh dan perintah sederhana sudah cukup. Ini kodenya:
sumber
Saya memiliki persyaratan yang serupa jadi saya menerapkannya seperti yang ditunjukkan di bawah ini. Ini diuji pada Windows 64 bit dan Linux.
Ketika IP tidak dapat dijangkau, subprocess.check_output () memunculkan pengecualian. Verifikasi ekstra dapat dilakukan dengan mengekstraksi informasi dari baris keluaran 'Paket: Terkirim = 2, Diterima = 2, Hilang = 0 (kerugian 0%)'.
sumber
Inilah solusi menggunakan
subprocess
modul Python danping
alat CLI yang disediakan oleh OS yang mendasarinya. Diuji pada Windows dan Linux. Dukungan pengaturan batas waktu jaringan. Tidak memerlukan hak akses root (setidaknya di Windows dan Linux).sumber
Gunakan ini diuji pada python 2.7 dan berfungsi baik mengembalikan waktu ping dalam milidetik jika berhasil dan mengembalikan False saat gagal.
sumber
Satu hal yang terlewatkan oleh banyak jawaban adalah (setidaknya di Windows)
ping
perintah mengembalikan 0 (menunjukkan keberhasilan) jika menerima balasan "Host tujuan tidak dapat dijangkau."Berikut adalah kode saya yang memeriksa apakah
b'TTL='
ada dalam respons, karena hanya ada saat ping mencapai host. Catatan: Sebagian besar kode ini didasarkan pada jawaban lain di sini.Catatan: Ini menangkap output alih-alih mencetaknya, jadi jika Anda ingin melihat outputnya
ping
, Anda harus mencetakcompletedPing.stdout
sebelum kembali.sumber
WINDOWS ONLY - Tidak dapat dipercaya tidak ada yang membuka Win32_PingStatus menggunakan kueri WMI sederhana, kami mengembalikan objek yang penuh dengan informasi yang sangat detail secara gratis
output sampel
sumber
Saya menerima pinjaman dari jawaban lain. Berusaha menyederhanakan dan meminimalkan pertanyaan.
sumber
Saya memerlukan sapuan ping yang lebih cepat dan saya tidak ingin menggunakan perpustakaan eksternal, jadi saya memutuskan untuk menggunakan konkurensi menggunakan built-in
asyncio
.Kode ini membutuhkan python 3.7+ dan dibuat dan diuji di Linux saja. Itu tidak akan berfungsi pada Windows tetapi saya yakin Anda dapat dengan mudah mengubahnya untuk bekerja pada Windows.
Saya bukan ahli dengan
asyncio
tetapi saya menggunakan artikel hebat ini Mempercepat Program Python Anda Dengan Concurrency dan saya datang dengan baris kode ini. Saya mencoba membuatnya sesederhana mungkin, jadi kemungkinan besar Anda perlu menambahkan lebih banyak kode sesuai kebutuhan Anda.Itu tidak mengembalikan benar atau salah, saya pikir akan lebih nyaman hanya dengan membuatnya mencetak IP yang menanggapi permintaan ping. Saya pikir ini cukup cepat, ping 255 ips dalam hampir 10 detik.
Output sampel:
Perhatikan bahwa IP tidak dalam urutan, karena IP dicetak segera setelah itu menjawab, sehingga yang menjawab pertama akan dicetak terlebih dahulu.
sumber
Yang sederhana saya baru saja memasak dalam satu menit..menggunakan icmplib membutuhkan root privs di bawah ini bekerja cukup baik! HTH
sumber