ম্যাকের ঠিকানা পাওয়া


111

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

কেউ কি ম্যাক ঠিকানা পেতে ক্রস প্ল্যাটফর্ম পদ্ধতি (উইন্ডোজ এবং লিনাক্স) পদ্ধতি জানেন? যদি তা না হয়, তবে আমি উপরে তালিকাভুক্ত সেগুলি সম্পর্কে কি আর কোনও মার্জিত পদ্ধতিগুলি জানেন?


এখানে অনেকগুলি সম্ভাব্য সহায়ক উত্তর রয়েছে! পাইথনে আমি কীভাবে eth0 এর আইপি ঠিকানা পেতে পারি?
আহো

উত্তর:


160

পাইথন 2.5 এর মধ্যে একটি ইউউইড বাস্তবায়ন রয়েছে যার অন্তত একটি সংস্করণে ম্যাক ঠিকানা প্রয়োজন। আপনি সহজেই নিজের কোডটিতে ম্যাক ফাংশনটি আমদানি করতে পারেন:

from uuid import getnode as get_mac
mac = get_mac()

প্রত্যাবর্তন মান হ'ল 48 বিট পূর্ণসংখ্যা হিসাবে ম্যাক ঠিকানা।


25
আমি এটি একটি উইন্ডোজ বাক্সে চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করেছে ... আমি যে ল্যাপটপটিতে এটি চেষ্টা করেছি সেটিতে 2 টি এনআইসি (একটি ওয়্যারলেস) রয়েছে এবং এটি কোন ম্যাকটি ফিরে এসেছে তা নির্ধারণের উপায় নেই। আপনি যদি এই কোডটি ব্যবহার করতে চান তবে কেবলমাত্র একটি সতর্কতার শব্দ।
টেকনোমলজিকাল

24
কেবলমাত্র একটি সতর্কতা: আপনি যদি getnodeডকুমেন্টেশনের দিকে লক্ষ্য করেন তবে এটি বলছে যে এটি ম্যাক সনাক্ত করতে ব্যর্থ হলে এটি একটি এলোমেলো দীর্ঘ ফিরিয়ে দেবে: "যদি হার্ডওয়্যার ঠিকানা প্রাপ্তির জন্য সমস্ত প্রচেষ্টা ব্যর্থ হয়, আমরা এর অষ্টম বিট সহ একটি র্যান্ডম 48-বিট নম্বর বেছে নিই আরএফসি 4122 তে প্রস্তাবিত হিসাবে 1 এ সেট করুন "" সুতরাং যে অষ্টম বিট চেক করুন!
ডিননিচুসুর

27
hex(mac)ম্যাকের পরিচিত হেক্স ফর্ম্যাটটি পেতে
স্ক্রিনশট

43
বা ':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))একটি বড় হাতের ম্যাকের জন্য প্রতিটি বাইট সহ একটি কোলন দিয়ে আলাদা।
টমলোগিক

5
getnode () প্রতিবার আমার উইন্ডোজ 7 ল্যাপটপটি পুনঃসূচনা করার সময় আলাদা কিছু ফেরত দেয়।
এভারেস্ট

80

একটি নির্দিষ্ট স্থানীয় ইন্টারফেসের জন্য ম্যাক পাওয়ার জন্য লিনাক্সের অধীনে এই সমস্যার খাঁটি অজগর সমাধানটি মূলত বিষ্ণুব্বের একটি মন্তব্য হিসাবে পোস্ট করা হয়েছিল এবং এই অ্যাক্টিস্টেট রেসিপিটিতে বেন ম্যাকে দ্বারা উন্নত করা হয়েছে

#!/usr/bin/python

import fcntl, socket, struct

def getHwAddr(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return ':'.join(['%02x' % ord(char) for char in info[18:24]])

print getHwAddr('eth0')

এটি পাইথন 3 উপযোগী কোড:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import fcntl
import socket
import struct


def getHwAddr(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', bytes(ifname, 'utf-8')[:15]))
    return ':'.join('%02x' % b for b in info[18:24])


def main():
    print(getHwAddr('enp0s8'))


if __name__ == "__main__":
    main()

35

নেটিফেসগুলি ম্যাক ঠিকানা (এবং অন্যান্য ঠিকানা) পাওয়ার জন্য ব্যবহার করার জন্য একটি ভাল মডিউল। এটি ক্রসপ্ল্যাটফর্ম এবং সকেট বা ইউইড ব্যবহারের চেয়ে কিছুটা বেশি অর্থবোধ করে।

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0', 'tun2']

>>> netifaces.ifaddresses('eth0')[netifaces.AF_LINK]
[{'addr': '08:00:27:50:f2:51', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]


এটি ব্যক্তিগতভাবে ব্যবহৃত হয়, প্রতিটি সিস্টেমে একটি নির্দিষ্ট ইনস্টল / সংকলন প্রয়োজন তবে এটি ভালভাবে কাজ করে।
এচ

22

অন্য একটি জিনিস যা আপনার লক্ষ্য করা উচিত তা হ'ল uuid.getnode()এলোমেলোভাবে 48-বিট নম্বর ফিরিয়ে ম্যাক অ্যাড্রেটরটিকে নকল করতে পারে যা আপনি প্রত্যাশা করছেন তা নাও হতে পারে। এছাড়াও, ম্যাক ঠিকানা নকল হয়েছে এমন কোনও সুস্পষ্ট ইঙ্গিত নেই, তবে আপনি getnode()দুবার ফোন করে এবং ফলাফলটি পৃথক হয় কিনা তা দেখে আপনি এটি সনাক্ত করতে পারেন। যদি উভয় কল দিয়ে একই মানটি ফিরে আসে তবে আপনার কাছে ম্যাক ঠিকানা রয়েছে, অন্যথায় আপনি একটি জাল ঠিকানা পেয়ে যাচ্ছেন।

>>> print uuid.getnode.__doc__
Get the hardware address as a 48-bit positive integer.

    The first time this runs, it may launch a separate program, which could
    be quite slow.  If all attempts to obtain the hardware address fail, we
    choose a random 48-bit number with its eighth bit set to 1 as recommended
    in RFC 4122.

8
এটি নয় যে অষ্টমীর মানটি 1 যথাযথ কারণ এটি কোনও নেটওয়ার্ক কার্ডের সাহায্যে ব্যবহার করা যায় না। ঠিক এই বিটটি পরীক্ষা করা ঠিকানা নকল কিনা তা সনাক্ত করার জন্য যথেষ্ট।
ফ্রেডেরিক গ্রোহানস

15
চেকটি কেবলমাত্র এটি দিয়ে করা হয়েছে: যদি (ম্যাক >> 40)% 2: ওএসররার উত্থাপন করুন, "সিস্টেমটির কোনও বৈধ ম্যাক নেই বলে মনে হচ্ছে না"
ফ্রেডেরিক গ্রোহানস

17

কখনও কখনও আমাদের একাধিক নেট ইন্টারফেস থাকে।

নির্দিষ্ট ইন্টারফেসের ম্যাক ঠিকানা সন্ধানের একটি সহজ পদ্ধতি হ'ল:

def getmac(interface):

  try:
    mac = open('/sys/class/net/'+interface+'/address').readline()
  except:
    mac = "00:00:00:00:00:00"

  return mac[0:17]

পদ্ধতিটি কল করা সহজ

myMAC = getmac("wlan0")

2
ওএস এক্স বা উইন্ডোজ জন্য সুপার দরকারী নয়। : |
এলোমেলো ইনসানো

1
পিস জন্য নিখুঁত!
মাইকেটি

8

আমার উত্তরটি এখান থেকে ব্যবহার করে: https://stackoverflow.com/a/18031868/2362361

আপনি কোন আইফেসের জন্য ম্যাক চান তা জেনে রাখা জরুরী কারণ যেহেতু অনেকের অস্তিত্ব থাকতে পারে (ব্লুটুথ, বেশ কয়েকটি নিক ইত্যাদি)।

এটি যখন কাজ করে আপনি যখন আইফেসের জন্য ম্যাকের প্রয়োজন হয় তার আইপি জানেন netifaces(পিপিআইতে উপলব্ধ):

import netifaces as nif
def mac_for_ip(ip):
    'Returns a list of MACs for interfaces that have given IP, returns None if not found'
    for i in nif.interfaces():
        addrs = nif.ifaddresses(i)
        try:
            if_mac = addrs[nif.AF_LINK][0]['addr']
            if_ip = addrs[nif.AF_INET][0]['addr']
        except IndexError, KeyError: #ignore ifaces that dont have MAC or IP
            if_mac = if_ip = None
        if if_ip == ip:
            return if_mac
    return None

পরীক্ষামূলক:

>>> mac_for_ip('169.254.90.191')
'2c:41:38:0a:94:8b'

6

আপনি ক্রু প্ল্যাটফর্ম যা সোসুইটাল দিয়ে এটি করতে পারেন:

import psutil
nics = psutil.net_if_addrs()
print [j.address for j in nics[i] for i in nics if i!="lo" and j.family==17]

import socketতারপরে [addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]ফলাফল['ab:cd:ef:01:02:03']
ডন লি

3

নোট করুন যে আপনি শর্তাধীন আমদানি ব্যবহার করে পাইথনে আপনার নিজস্ব ক্রস-প্ল্যাটফর্ম লাইব্রেরি তৈরি করতে পারেন। যেমন

import platform
if platform.system() == 'Linux':
  import LinuxMac
  mac_address = LinuxMac.get_mac_address()
elif platform.system() == 'Windows':
  # etc

এটি আপনাকে ওএস.সিস্টেম কল বা প্ল্যাটফর্ম-নির্দিষ্ট লাইব্রেরি ব্যবহার করার অনুমতি দেবে।


2
এটি আসলে কোনও উত্তর নয় - কেবল একটি মন্তব্য
স্টেফানো

1

ক্রস-প্ল্যাটফর্ম গেটম্যাক প্যাকেজ এটির জন্য কাজ করবে, যদি আপনি নির্ভরতা গ্রহণে আপত্তি করেন না। এটি পাইথন 2.7+ এবং 3.4+ এর সাথে কাজ করে। কোনও ঠিকানা না পাওয়া বা কোনওটি না ফেরানো পর্যন্ত এটি অনেকগুলি বিভিন্ন পদ্ধতির চেষ্টা করবে।

from getmac import get_mac_address
eth_mac = get_mac_address(interface="eth0")
win_mac = get_mac_address(interface="Ethernet 3")
ip_mac = get_mac_address(ip="192.168.0.1")
ip6_mac = get_mac_address(ip6="::1")
host_mac = get_mac_address(hostname="localhost")
updated_mac = get_mac_address(ip="10.0.0.1", network_request=True)

দাবি অস্বীকার: আমি প্যাকেজের লেখক।

আপডেট (জানুয়ারী 14 2019): প্যাকেজটি কেবল পাইথন 2.7+ এবং 3.4+ সমর্থন করে। আপনি যদি পুরানো পাইথন (2.5, 2.6, 3.2, 3.3) এর সাথে কাজ করতে চান তবে আপনি প্যাকেজের একটি পুরানো সংস্করণ ব্যবহার করতে পারেন।



0

আমি একীভূত উপায় সম্পর্কে জানি না, তবে এমন কিছু যা আপনি দরকারী মনে করতে পারেন:

http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451

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


0

লিনাক্সের জন্য আমাকে এমন একটি শেল স্ক্রিপ্ট চালু করতে দিন যা ম্যাক ঠিকানাটি প্রদর্শন করবে এবং এটি (ম্যাক স্নিফিং) পরিবর্তনের অনুমতি দেবে।

 ifconfig eth0 | grep HWaddr |cut -dH -f2|cut -d\  -f2
 00:26:6c:df:c3:95

কাটা যুক্তিগুলি ডিফার করতে পারে (আমি কোনও বিশেষজ্ঞ নই) চেষ্টা করুন:

ifconfig etho | grep HWaddr
eth0      Link encap:Ethernet  HWaddr 00:26:6c:df:c3:95  

ম্যাক পরিবর্তন করতে আমরা এটি করতে পারি:

ifconfig eth0 down
ifconfig eth0 hw ether 00:80:48:BA:d1:30
ifconfig eth0 up

ম্যাক ঠিকানাটি 00: 80: 48: বিএ: ডি 1: 30 এ পরিণত হবে (অস্থায়ীভাবে, পুনরায় বুট করার পরে প্রকৃতটিতে পুনরুদ্ধার করবে)।


6
এই প্রশ্ন দিয়ে কিছু করতে হবে?
বট 47


-8

লিনাক্সের জন্য আপনি একটি এসআইওসিজিফএইচডাব্লুএইচডিএডআইআরএইচটিএল ব্যবহার করে ম্যাক ঠিকানাটি পুনরুদ্ধার করতে পারেন।

struct ifreq    ifr;
uint8_t         macaddr[6];

if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0)
    return -1;

strcpy(ifr.ifr_name, "eth0");

if (ioctl(s, SIOCGIFHWADDR, (void *)&ifr) == 0) {
    if (ifr.ifr_hwaddr.sa_family == ARPHRD_ETHER) {
        memcpy(macaddr, ifr.ifr_hwaddr.sa_data, 6);
        return 0;
... etc ...

আপনি "অজগর" প্রশ্নটি ট্যাগ করেছেন। আমি এই তথ্যটি পেতে কোনও পাইথন মডিউল সম্পর্কে জানি না। আপনি সরাসরি আইওএসটিএল কল করতে সিটিপস ব্যবহার করতে পারেন ।


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