मैक पते से IPv6 पता प्राप्त करने के लिए शेल का उपयोग कैसे करें?


11

हम जानते हैं कि हम इंटरफ़ेस पहचानकर्ता बनाने के लिए मैक पते का उपयोग कर सकते हैं, उदाहरण के लिए लिंक-स्थानीय आईपीवी 6 पते के लिए जो नेटवर्क में अद्वितीय होना चाहिए।

छवि ऐसा करने का तरीका दिखाती है:

मैक पते से इंटरफ़ेस पहचानकर्ता बनाएँ

मेरे प्रश्न हैं:

  • मैं कैसे उपयोग कर एक मैक से एक IPv6 पता बना सकते हैं awkया sed?
  • या फिर कोई आदेश है जो मुझे एक विशिष्ट मैक (ऐसा कुछ createIPv6 myMAC) के लिए लिंक-स्थानीय आईपीवी 6 पता देता है ?

मैंने आपके प्रश्न को थोड़ा सा रद्द कर दिया (लंबित समीक्षा)। IPv6 पतों को MAC पतों से नहीं निकाला जाता है, बल्कि बनाया जाता है। और यहां आप केवल आईपीवी 6 पते के इंटरफ़ेस आइडेंटिफायर भाग (अंतिम 64 बिट) के साथ सौदा करते हैं। लेकिन मुझे यकीन नहीं है: क्या आप केवल इंटरफ़ेस पहचानकर्ता या संपूर्ण IPv6 पता चाहते हैं? कृपया मुझे फिर से संपादित करें, अगर मैं आपको सही ढंग से नहीं समझा।
डबुन

@ डब्बू, संपादन के लिए धन्यवाद, मुझे पूरा आईपीवी 6 पता चाहिए।
नवोदित

जवाबों:


10

यदि आप MAC (और किसी दिए गए उपसर्ग) से पूरा IPv6 पता बनाना चाहते हैं, तो आप ipv6calcपीटर बायलर द्वारा उत्कृष्ट उपकरण का उपयोग कर सकते हैं ।

निम्न आदेश fe80::मैक पते से एक लिंक-स्थानीय IPv6 पता ( उपसर्ग) बनाता है :

$ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b
fe80::221:5bff:fef7:251b

आप अधिकांश विकल्पों को छोड़ सकते हैं और कमांड को अनुमान लगा सकते हैं कि क्या करना है:

$ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::221:5bff:fef7:251b

डेबियन डिस्ट्रोस के लिए, ipv6calcमुख्य भंडार में है।


4

से आईपीवी 6 विकिपीडिया प्रविष्टि एक अधिक शाब्दिक वर्णन:

64-बिट इंटरफ़ेस आइडेंटिफ़ायर सबसे अधिक इसके 48-बिट मैक पते से प्राप्त होता है।

एक मैक पता 00: 0C: 29: 0C: 47: D5 को FF: FE को बीच में डालकर 64-बिट EUI-64 में बदल दिया जाता है: 00: 0C: 29: FF: FE: 0C: 47: D5।

तो तीसरे :को बदलने के साथ :FF:FE:यह करना चाहिए:

echo  00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3
00:0C:29:FF:FE:0C:47:D5

कोई विचार नहीं है कि अगर सिंटैक्स जीएनयू sed के लिए विशिष्ट है।


कार्य प्रगति पर है:

इसे बिट्स में बदलें:

for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5) 
  do 
    printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX") 
  done

00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101बिट संख्या 7 के केवल flipping को छोड़कर बिट्स में परिणाम होना चाहिए ।


1
7-वें बिट को उलटने के बारे में क्या!
निदाल

आह यू / एल बिट, अच्छा बिंदु!
HBruijn


0

आप एक बैश फ़ंक्शन बना सकते हैं (और इसे अपने में रखें ~/.bashrc) जो IFSमैक पते को 6 कोलोन-अलग किए गए समूहों में विभाजित करने और उन्हें असेंबल करने के लिए उपयोग करता है। आपको पहले बाइट के 7 वें सबसे महत्वपूर्ण बिट यानी 1 बिट को फ्लिप करना होगा:

mac_to_ipv6_ll() {
    IFS=':'; set $1; unset IFS
    echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

उपयोग उदाहरण:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012

0

मुझे शुद्ध-खोल के लिए @ रुडो77 से ऊपर कुदोस देना चाहिए (जब तक कि आप प्रिंटफ़ की गिनती नहीं करते हैं) ऊपर उत्तर दें, जो मैं चाह रहा था।

यह इसमें थोड़ा सा जोड़ देता है:

(ए) प्रत्येक 16-बिट चंक में किसी भी अग्रणी शून्य के साथ; तथा

(बी) आईआईडी की शुरुआत में किसी भी आगे के सभी शून्य विखंडू के साथ

... पते की संक्षिप्तता के लिए आम सम्मेलनों के अनुसार।

mac_to_eui64() {
 IFS=':'; set $1; unset IFS
 echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
  sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}

ध्यान दें कि यदि आप अन्य (मनमाने ढंग से) उपसर्गों के लिए इसका पुनर्निमाण करना चाहते हैं, जिसे आप EUI-64 के बाद से किसी भी दायरे में उपयोग कर सकते हैं (हालाँकि यह सलाह दी जाती है कि इसे गोपनीयता कारणों से वैश्विक पतों के लिए उपयोग न करें), आपको थोड़ी आवश्यकता होगी अधिक जटिल sed स्क्रिप्ट। ऐसा इसलिए है क्योंकि fe80::उपसर्ग में पहले से ही IID की शुरुआत से सटे तीन शून्य-चक्र (डबल-कोलन के लिए उत्कीर्ण) शामिल हैं। इस प्रकार यहां तक ​​कि अगर IID का पहला हिस्सा ऑल-जीरो है (अर्थात, यदि MAC के साथ शुरू हुआ 02:00), तो इसे भी बढ़ाया जाएगा। EUI-64 प्रारूप केवल एक और हिस्सा छोड़ देता है जो कि सभी शून्य हो सकता है - अंतिम एक - जो ऊपर की स्क्रिप्ट को एक एकल शून्य के रूप में वापस जोड़ता है। अन्य उपसर्गों को दो कॉलनों के बीच एक शून्य छोड़ने की आवश्यकता हो सकती है।


आप सही कह रहे हैं, धन्यवाद - मैं वापस चला गया और @ रूबो77 को printfअकेला छोड़ दिया और इसके बजाय sed में अतिरिक्त सामान किया।
हेडबैंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.