Saya memerlukan metode lintas platform untuk menentukan alamat MAC komputer pada saat dijalankan. Untuk windows, modul 'wmi' dapat digunakan dan satu-satunya metode di Linux yang dapat saya temukan adalah menjalankan ifconfig dan menjalankan regex di seluruh outputnya. Saya tidak suka menggunakan paket yang hanya bekerja pada satu OS, dan mengurai output dari program lain sepertinya tidak terlalu elegan apalagi rawan kesalahan.
Adakah yang tahu metode lintas platform (windows dan linux) metode untuk mendapatkan alamat MAC? Jika tidak, apakah ada yang tahu metode yang lebih elegan dari yang saya sebutkan di atas?
python
windows
linux
networking
Mark Roddy
sumber
sumber
Jawaban:
Python 2.5 menyertakan implementasi uuid yang (setidaknya dalam satu versi) membutuhkan alamat mac. Anda dapat mengimpor fungsi pencarian mac ke dalam kode Anda sendiri dengan mudah:
Nilai yang dikembalikan adalah alamat mac sebagai bilangan bulat 48 bit.
sumber
getnode
dokumentasi, dikatakan bahwa ia akan mengembalikan panjang acak jika gagal mendeteksi mac: "Jika semua upaya untuk mendapatkan alamat perangkat keras gagal, kami memilih nomor 48-bit acak dengan bit kedelapan setel ke 1 seperti yang direkomendasikan di RFC 4122. " Jadi periksa bagian kedelapan itu!hex(mac)
untuk mendapatkan format hex familiar dari mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
untuk MAC huruf besar dengan setiap byte dipisahkan oleh titik dua.Solusi python murni untuk masalah ini di Linux untuk mendapatkan MAC untuk antarmuka lokal tertentu, awalnya diposting sebagai komentar oleh vishnubob dan ditingkatkan oleh Ben Mackey dalam resep aktivasi ini
Ini adalah kode yang kompatibel dengan Python 3:
sumber
netifaces adalah modul yang bagus untuk digunakan untuk mendapatkan alamat mac (dan alamat lain). Ini lintas platform dan lebih masuk akal daripada menggunakan soket atau uuid.
lokasi pypi
Pengenalan yang bagus tentang netifaces
sumber
Satu hal lain yang harus Anda perhatikan adalah bahwa
uuid.getnode()
dapat memalsukan alamat MAC dengan mengembalikan nomor 48-bit acak yang mungkin bukan yang Anda harapkan. Selain itu, tidak ada indikasi eksplisit bahwa alamat MAC telah dipalsukan, tetapi Anda dapat mendeteksinya dengan menelepongetnode()
dua kali dan melihat apakah hasilnya bervariasi. Jika nilai yang sama dikembalikan oleh kedua panggilan, Anda memiliki alamat MAC, jika tidak, Anda akan mendapatkan alamat palsu.sumber
Terkadang kami memiliki lebih dari satu antarmuka internet.
Metode sederhana untuk mengetahui alamat mac dari antarmuka tertentu, adalah:
memanggil metode ini sederhana
sumber
Menggunakan jawaban saya dari sini: https://stackoverflow.com/a/18031868/2362361
Penting untuk mengetahui untuk iface mana Anda menginginkan MAC karena banyak yang bisa ada (bluetooth, beberapa nics, dll.).
Ini melakukan pekerjaan ketika Anda mengetahui IP iface yang Anda butuhkan MAC-nya, menggunakan
netifaces
(tersedia di PyPI):Pengujian:
sumber
Anda dapat melakukan ini dengan psutil yang bersifat lintas platform:
sumber
import socket
kemudian[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
menghasilkan['ab:cd:ef:01:02:03']
Perhatikan bahwa Anda dapat membuat pustaka lintas platform Anda sendiri dengan python menggunakan impor bersyarat. misalnya
Ini akan memungkinkan Anda untuk menggunakan panggilan os.system atau pustaka khusus platform.
sumber
Paket getmac lintas platform akan berfungsi untuk ini, jika Anda tidak keberatan menggunakan ketergantungan. Ia bekerja dengan Python 2.7+ dan 3.4+. Ini akan mencoba berbagai metode sampai mendapatkan alamat atau mengembalikan Tidak Ada.
Penafian: Saya adalah pembuat paket.
Pembaruan (14 Jan 2019): paket sekarang hanya mendukung Python 2.7+ dan 3.4+. Anda masih dapat menggunakan versi paket yang lebih lama jika Anda perlu bekerja dengan Python yang lebih lama (2.5, 2.6, 3.2, 3.3).
sumber
Untuk mendapatkan
eth0
alamat MAC antarmuka,sumber
Saya tidak tahu cara bersatu, tetapi inilah sesuatu yang mungkin berguna bagi Anda:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
Apa yang akan saya lakukan dalam kasus ini adalah membungkus ini menjadi sebuah fungsi, dan berdasarkan OS itu akan menjalankan perintah yang tepat, mengurai sesuai kebutuhan dan hanya mengembalikan alamat MAC yang diformat seperti yang Anda inginkan. Tentu saja semua sama, kecuali Anda hanya perlu melakukannya sekali, dan terlihat lebih bersih dari kode utama.
sumber
Untuk Linux izinkan saya memperkenalkan skrip shell yang akan menampilkan alamat mac dan memungkinkan untuk mengubahnya (mengendus MAC).
Perselisihan yang dipotong mungkin berbeda (saya bukan ahli) coba:
Untuk mengubah MAC kita dapat melakukan:
akan mengubah alamat mac menjadi 00: 80: 48: BA: d1: 30 (sementara, akan dikembalikan ke alamat sebenarnya saat reboot).
sumber
Kalau tidak,
sumber
Untuk Linux, Anda dapat mengambil alamat MAC menggunakan ioctl SIOCGIFHWADDR.
Anda telah menandai pertanyaan "python". Saya tidak tahu modul Python yang ada untuk mendapatkan informasi ini. Anda dapat menggunakan ctypes untuk memanggil ioctl secara langsung.
sumber