सवाल कैसे पता चलेगा कि एक मशीन एक ईसी 2 उदाहरण है


मैं मेजबानों पर कुछ स्क्रिप्ट चलाने की इच्छा रखता हूं जो ईसी 2 उदाहरण हैं लेकिन मुझे नहीं पता कि मेजबान कैसे है वास्तव में एक ईसी 2 उदाहरण।

मैंने कुछ परीक्षण किए हैं, लेकिन यह पर्याप्त नहीं है:

  • परीक्षण करें कि बाइनरी ec2_userdata उपलब्ध है (लेकिन यह हमेशा सत्य नहीं होगा)
  • परीक्षण की उपलब्धता "http://169.254.169.254/latest/meta-data"(लेकिन क्या यह हमेशा सच रहेगा? और यह" जादुई आईपी "क्या है?)

39
2018-01-04 09:12


मूल


16 9.254.0.0/16 "लिंक स्थानीय" ब्लॉक है। - Charles
यह वास्तव में एक एपीआईपीए पता है, जो मेटा डेटा पुनर्प्राप्ति जैसी महत्वपूर्ण सेवा के संदर्भ के रूप में उपयोग करने के लिए काफी अजीब है। - Matthieu Cerda
ईसी 2 की आईपी श्रेणियां सार्वजनिक हैं (हालांकि समय-समय पर भिन्न होती हैं)। यदि आप वर्तमान सूची के साथ रहते हैं तो आप उस श्रेणी के खिलाफ आईपी जांच सकते हैं। - Karma Fusebox
यदि आप ईसी 2 चाहते हैं तो 16 9.254.169.254 पर भरोसा न करें केवल ईसी 2 - ईसी 2-जैसे नीलगिरी जैसे सिस्टम भी इसका समर्थन करते हैं। engage.eucalyptus.com/customer/portal/articles/... - ceejayoz
क्या आपको किसी ऐसे हमलावर के खिलाफ काम करने की विधि चाहिए जिस पर मेजबान पर रूट है, और यह सोचने में आपको धोखा देने की कोशिश कर रहा है कि यह अपने स्वयं के दुर्भावनापूर्ण उद्देश्यों के लिए एक ईसी 2 उदाहरण है? यदि आप करते हैं, तो यह बहुत कठिन होगा। - Mike Scott


जवाब:


वास्तव में, यह पता लगाने का एक बहुत ही आसान तरीका है कि होस्ट एक ईसी 2 उदाहरण है: अपने सार्वजनिक आईपी के रिवर्स लुकअप की जांच करें। ईसी 2 रिवर्स को याद करने में काफी मुश्किल होती है।

साथ ही, यदि आपने इसे संशोधित नहीं किया है, तो होस्टनाम आपका रिवर्स होना चाहिए, जिससे इसे और अधिक आसान बनाना आसान हो जाता है।

आप "जादुई आईपी" का भी उपयोग कर सकते हैं, क्योंकि आप वास्तव में ईसी 2 इंस्टेंस टैग प्राप्त करने का मानक तरीका है, हालांकि, यदि आप ईसी 2 नेटवर्क पर नहीं हैं, तो आपको टाइमआउट की प्रतीक्षा करनी होगी, जो आम तौर पर नहीं है वांछित...

यदि ये विधियां पर्याप्त नहीं हैं, तो बस अपने आईपी का एक जोइस करें और जांचें कि क्या आप अंदर हैं और अमेज़ॅन ईसी 2 आईपी ब्लॉक है।

संपादित करें: आप इस छोटे खोल बिट का उपयोग कर सकते हैं:

#!/bin/bash
LOCAL_HOSTNAME=$(hostname -d)
if [[ ${LOCAL_HOSTNAME} =~ .*\.amazonaws\.com ]]
then
        echo "This is an EC2 instance"
else
        echo "This is not an EC2 instance, or a reverse-customized one"
fi

सावधान हालांकि, [[एक bashism है। आप पाइथन या पर्ल यूनिलाइन, वाईएमएमवी का भी उपयोग कर सकते हैं।


3
2018-01-04 09:20



यह एक वीपीसी या पर्यावरण में काम नहीं करता है जहां आपने होस्टनाम बदल दिया है; जैसे। अगर आपकी मशीनें डोमेन.लोकल में हैं - Preflightsiren
होस्टनाम बिट बस असफल होने के लिए बाध्य है। - Dan Pritts
hostname -d रिटर्न eu-west-1.compute.internal - Bulletmagnet


त्रुटि संदेशों से बचने के लिए हेंस का जवाब बदल दिया और स्क्रिप्ट में उदाहरण उपयोग शामिल करें:

if [ -f /sys/hypervisor/uuid ] && [ `head -c 3 /sys/hypervisor/uuid` == ec2 ]; then
    echo yes
else
    echo no
fi

यह विंडोज़ उदाहरणों में काम नहीं करता है। कर्ल पर लाभ यह है कि यह ईसी 2 और गैर-ईसी 2 दोनों पर तात्कालिक है।


37
2018-06-22 18:36



एडब्ल्यूएस भी इस तरह से करने की सिफारिश करने लगते हैं docs.aws.amazon.com/AWSEC2/latest/UserGuide/... - Mike
मुझे यह विधि पसंद है। बस जागरूक रहें कि एक हाइपरवाइजर के तहत चल रही एक गैर-ईसी 2 प्रणाली यूयूआईडी उत्पन्न कर सकती है जो शुरू होती है ec2 - एक झूठी सकारात्मक। यह असंभव है (एक 1-इन -256 मौका) और केवल तभी जब आप एक हाइपरवाइजर का उपयोग कर रहे हैं जो उस फ़ाइल को पॉप्युलेट करता है। यही कारण है कि उपरोक्त लिंक दस्तावेज कहता है "आप हैं शायद एक ईसी 2 उदाहरण देख रहे हैं "। - Nate
@ नेट, अच्छा बिंदु, लेकिन यह 4096 मौका में 1 नहीं होना चाहिए? (16 x 16 x 16) - Wildcard
@ वाइल्डकार्ड: मैं अपनी टिप्पणी संपादित नहीं कर सकता, लेकिन यह सही है। - Nate
खतरा! इस विधि ने वर्षों से हमारे लिए भरोसेमंद काम किया था ... हाल ही में, नवीनतम सी 5 और एम 5 प्रकारों के साथ यह फ़ाइल मौजूद नहीं है। तो मुझे फॉलबैक चेक जोड़ना है 169.254.169.254 उन उदाहरणों को संभालने के लिए। - Josh Kupershmidt


आईपी ​​के बजाय ईसी 2 आंतरिक डोमेन नाम से मेटाडेटा की तलाश करें, यदि आप ईसी 2 पर नहीं हैं, तो तेजी से DNS विफलता लौटाएंगे, और आईपी संघर्ष या रूटिंग मुद्दों से बचाएगा:

curl -s http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"

कुछ distros पर, बहुत बुनियादी प्रणाली, या बहुत जल्द स्थापना चरणों में कर्ल उपलब्ध नहीं है। का उपयोग करते हुए wget बजाय:

wget -q http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"

16
2018-02-13 18:41



दुर्भाग्यवश, वीपीसी में विफल होने लगते हैं! - Ashe
डबल कोट्स के अंदर विस्मयादिबोधक चिह्न चरित्र का भी उपयोग न करें - आपकी गूंज उड़ा सकता है साथ में -bash: !": event not found। उन लोगों के लिए एकल उद्धरण का प्रयोग करें echoइसके बजाए - Josh Kupershmidt
यह शायद मानता है कि सर्वर अभी भी EC2s DNS सर्वर का उपयोग कर रहा है जो ec2.internal क्षेत्र के बारे में जानते हैं और किसी ने /etc/resolv.conf को 8.8.8.8 में बदल दिया है या अपने स्वयं के DNS infastructure को लुढ़का है। - lamont
ऐसा लगता है कि एडब्ल्यूएस टूट गया है। मैं अब उदाहरण-डेटा.ec2.internal हल नहीं कर सकता। उदाहरण- data.us-west-2.compute.internal काम, हालांकि, कम से कम अभी के लिए। - Bryan Larsen


यदि लक्ष्य यह बताने के लिए है कि यह एक ईसी 2 उदाहरण है या किसी अन्य प्रकार का क्लाउड उदाहरण है, तो Google की तरह dmidecode बहुत अच्छी तरह से काम करता है और कोई नेटवर्किंग की आवश्यकता नहीं है। मुझे यह कुछ अन्य दृष्टिकोणों के साथ पसंद है क्योंकि मेटाडाटा यूआरएल पथ ईसी 2 और जीसीई के लिए अलग है।

# From a google compute VM
$ sudo dmidecode -s bios-version
Google

# From an amazon ec2 VM
$ sudo dmidecode -s bios-version
4.2.amazon

15
2018-05-05 16:02



मैं उम्मीद करता हूं कि यह अन्य वीएम वातावरण में और यहां तक ​​कि असली हार्डवेयर पर भी ठीक काम करेगी - मुझे उम्मीद नहीं है कि किसी भी हार्डवेयर विक्रेता सिस्टम को शिप करें जहां बायोस संस्करण "अमेज़ॅन" कहता है ... - Guss


सबसे पहले, मुझे मौजूदा उत्तरों के साथ निम्नलिखित सूक्ष्म समस्याओं के कारण एक नया उत्तर पोस्ट करने की आवश्यकता महसूस हुई, और मेरे बारे में एक प्रश्न प्राप्त करने के बाद @ qwertzguy के उत्तर पर टिप्पणी करें। वर्तमान उत्तरों के साथ समस्याएं यहां दी गई हैं:

  1. स्वीकार्य उत्तर @MatthieuCerda से निश्चित रूप से विश्वसनीय रूप से काम नहीं करता है, कम से कम किसी भी वीपीसी उदाहरणों पर मैंने जांच नहीं की है। (मेरे उदाहरणों पर, मुझे एक वीपीसी नाम मिलता है hostname -d, जिसका उपयोग आंतरिक DNS के लिए किया जाता है, इसमें "amazonaws.com" के साथ कुछ भी नहीं है।)
  2. उच्चतम वोट दिया गया जवाब @qwertzguy से नए एम 5 या सी 5 उदाहरणों पर काम नहीं करता है, जिसमें यह फ़ाइल नहीं है। अमेज़ॅन इस व्यवहार को दस्तावेज करने के लिए उपेक्षित करता है AFAIK, हालांकि डॉक्टर पेज इस विषय पर कहते हैं "... अगर / sys / hypervisor / uuid मौजूद है ... "। मैंने एडब्ल्यूएस समर्थन से पूछा कि क्या यह परिवर्तन जानबूझकर था, नीचे देखें †।
  3. @ जेर से जवाब जरूरी नहीं है कि हर जगह काम करें क्योंकि instance-data.ec2.internal DNS लुकअप काम नहीं कर सकता है। उबंटू ईसी 2 वीपीसी इंस्टेंस पर मैंने अभी परीक्षण किया, मैं देखता हूं: $ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal जो इस विधि पर गलत तरीके से निष्कर्ष निकालने का कारण बनता है कि यह ईसी 2 पर नहीं है!
  4. उपयोग करने के लिए जवाब dmidecode @ टामले से काम कर सकता है, लेकिन आप पर निर्भर करता है।) dmidecode आपके उदाहरण पर उपलब्ध है, और बी।) रूट या sudo आपके कोड के भीतर से पासवर्ड कम क्षमता।
  5. चेक / sys / devices / वर्चुअल / डीएमआई / आईडी / bios_version का जवाब @spkane से खतरनाक रूप से भ्रामक है! मैंने एक उबंटू 14.04 एम 5 उदाहरण की जांच की, और एक मिला bios_version का 1.0। यह फ़ाइल बिल्कुल दस्तावेज नहीं है अमेज़ॅन के डॉक्टर पर, तो मैं वास्तव में इस पर भरोसा नहीं करता।
  6. का पहला हिस्सा @ क्रिस-मोंटानारो से जवाब एक अविश्वसनीय तृतीय-पक्ष यूआरएल और उपयोग की जांच करने के लिए whois परिणामस्वरूप कई स्तरों पर समस्याग्रस्त है। ध्यान दें कि उस उत्तर में सुझाए गए यूआरएल अभी 404 पेज है! भले ही आपको तीसरी पार्टी की सेवा मिली जो काम करता है, यह तुलनात्मक रूप से होगा बहुत धीमी (स्थानीय रूप से फ़ाइल की जांच करने की तुलना में) और संभावित रूप से रेट-सीमित मुद्दों या नेटवर्क समस्याओं में भाग लेते हैं, या संभवतः आपके ईसी 2 इंस्टेंस में नेटवर्क पहुंच के बाहर भी नहीं है।
  7. में दूसरा सुझाव @ क्रिस-मोंटानारो से जवाब जाँच करने के लिए http://169.254.169.254/ थोड़ा बेहतर है, लेकिन एक और टिप्पणीकर्ता नोट करता है कि अन्य क्लाउड प्रदाता इस उदाहरण मेटाडाटा यूआरएल को उपलब्ध कराते हैं, इसलिए आपको झूठी सकारात्मकताओं से बचने के लिए सावधान रहना होगा। इसके अलावा यह स्थानीय फाइल की तुलना में अभी भी धीमा हो जाएगा, मैंने देखा है कि भारी रूप से लोड किए गए उदाहरणों पर मैंने यह चेक विशेष रूप से धीमा (वापसी के लिए कई सेकंड) देखा है। इसके अलावा, आपको एक पास करना याद रखना चाहिए -m या --max-time बहुत लंबे समय तक लटकने से बचने के लिए कर्ल का तर्क, खासकर गैर-ईसी 2 उदाहरण पर जहां यह पता कहीं भी नहीं जा सकता है और लटक सकता है (जैसा कि @ अल्गल का जवाब)।

इसके अलावा, मुझे नहीं लगता कि किसी ने उल्लेख किया है अमेज़ॅन के दस्तावेज (संभव) फ़ाइल के लिए जांच की फॉलबैक /sys/devices/virtual/dmi/id/product_uuid

कौन जानता था कि यह निर्धारित करना कि आप ईसी 2 पर चल रहे हैं, इतना जटिल हो सकता है ?! ठीक है, अब सूचीबद्ध सूचीबद्ध दृष्टिकोणों के साथ हमारे पास सबसे अधिक समस्याएं हैं, यह जांचने के लिए यहां एक सुझाव दिया गया है कि आप ईसी 2 पर चल रहे हैं या नहीं। मुझे लगता है कि यह लगभग किसी भी लिनक्स उदाहरणों पर आम तौर पर काम करना चाहिए, विंडोज़ उदाहरण पाठक के लिए एक अभ्यास है।

#!/bin/bash

# This first, simple check will work for many older instance types.
if [ -f /sys/hypervisor/uuid ]; then
  # File should be readable by non-root users.
  if [ `head -c 3 /sys/hypervisor/uuid` == "ec2" ]; then
    echo yes
  else
    echo no
  fi

# This check will work on newer m5/c5 instances, but only if you have root!
elif [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
  # If the file exists AND is readable by us, we can rely on it.
  if [ `head -c 3 /sys/devices/virtual/dmi/id/product_uuid` == "EC2" ]; then
    echo yes
  else
    echo no
  fi

else
  # Fallback check of http://169.254.169.254/. If we wanted to be REALLY
  # authoritative, we could follow Amazon's suggestions for cryptographically
  # verifying their signature, see here:
  #    https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
  # but this is almost certainly overkill for this purpose (and the above
  # checks of "EC2" prefixes have a higher false positive potential, anyway).
  if $(curl -s -m 5 http://169.254.169.254/latest/dynamic/instance-identity/document | grep -q availabilityZone) ; then
    echo yes
  else
    echo no
  fi

fi

जाहिर है, आप इसे और भी फ़ॉलबैक चेक के साथ विस्तारित कर सकते हैं, और हैंडलिंग के बारे में परावर्तक शामिल कर सकते हैं उदा। से एक झूठी सकारात्मक /sys/hypervisor/uuid अवसर से "ec2" के साथ शुरू करने के लिए हो रहा है और इतने पर। लेकिन यह चित्रण उद्देश्यों और शायद लगभग सभी गैर-रोगजनक उपयोग-मामलों के लिए एक अच्छा समाधान है।

[†] सी 5 / एम 5 उदाहरणों के परिवर्तन के बारे में एडब्ल्यूएस समर्थन से इस स्पष्टीकरण को वापस मिला:

सी 5 और एम 5 उदाहरण एक का उपयोग करते हैं नया हाइपरवाइजर स्टैक और संबंधित कर्नेल ड्राइवर Xen ड्राइवरों के रूप में sysfs (जिसे / sys पर आरोहित किया जाता है) में फ़ाइलें नहीं बनाते हैं अन्य / पुराने उदाहरण प्रकारों द्वारा उपयोग किया जाता है। यह पता लगाने का सबसे अच्छा तरीका है कि ऑपरेटिंग सिस्टम ईसी 2 उदाहरण पर चल रहा है या नहीं, इसमें सूचीबद्ध विभिन्न संभावनाओं के लिए जिम्मेदार है प्रलेखन आप जुड़े हुए हैं


10
2018-03-20 14:46



2018 में हाँ साथी यात्री ... यह वह जवाब है जिसे आप ढूंढ रहे हैं। - russellpierce


होस्टनाम बदलने की संभावना है, अपने सार्वजनिक आईपी के खिलाफ एक जोइस चलाएं:

if [[ ! -z $(whois $(curl -s shtuff.it/myip/short) | grep -i amazon) ]]; then 
  echo "I'm Amazon"
else 
  echo "I'm not Amazon"
fi

या एडब्ल्यूएस मेटा-डेटा यूआरएल मारा

if [[ ! -z $(curl -s http://169.254.169.254/1.0/) ]]; then 
  echo "I'm Amazon"
else 
  echo "I'm not Amazon"
fi

5
2017-07-02 14:09



यदि आप EC2 पर नहीं चल रहे हैं तो जल्दी से विफल होने के लिए दूसरे कर्ल कथन में एक-कनेक्ट-टाइमआउट 1 जोड़ें। - Jonathan Oliver
मेटाडाटा यूआरएल का उपयोग कर एफडब्ल्यूआईडब्ल्यू कर सकते हैं इंगित करें कि यह क्लाउड इंस्टेंस के रूप में चल रहा है, लेकिन यह निश्चित रूप से निर्धारित नहीं कर सकता कि यह विशेष रूप से EC2 है या नहीं। ओपनस्टैक और नीलगिरी भी उसी मेटाडाटा यूआरआई का उपयोग करते हैं। मुझे पता है कि यह नाइट उठा रहा है, लेकिन मेरे काम के लिए, क्लाउड प्रदाता क्या मायने रखता है। - EmmEff


यह ec2 में लिनक्स होस्ट के लिए भी अच्छी तरह से काम करता है और नेटवर्क और किसी भी संबंधित टाइमआउट की आवश्यकता नहीं है:

grep -q amazon /sys/devices/virtual/dmi/id/bios_version

यह काम करता है, क्योंकि अमेज़ॅन इस प्रविष्टि को इस प्रकार परिभाषित करता है:

$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon


5
2018-02-10 19:04



2018/05/01; उबंटू चल रहे एम 5 उदाहरणों पर अमान्य प्रतीत होता है। - russellpierce


test -f /sys/hypervisor/uuid -a `head -c 3 /sys/hypervisor/uuid` == ec2 && echo yes

लेकिन मुझे नहीं पता कि यह वितरण में कितना पोर्टेबल है।


3
2018-06-04 03:18



खैर, यह निश्चित रूप से विंडोज ईसी 2 उदाहरणों पर काम नहीं करेगा। - ceejayoz
मैं इस विधि को पसंद करता हूं क्योंकि इसमें नेटवर्क इंटरैक्शन शामिल नहीं है जो सभी प्रकार के कारणों से लटका सकता है। एक HTTP एक्सचेंज के लिए टाइमआउट का उपयोग लटकने से रोकने के लिए गारंटी नहीं है। मुझे विंडोज़ उदाहरणों की परवाह नहीं है। - Hannes
यही वही है जो मुझे चाहिए! कुछ curl'ing से बेहतर रास्ता, धन्यवाद! - qwertzguy
पूर्ण यूयूआईडी का उपयोग करने पर विचार करें, बस कुछ अन्य विक्रेता के हाइपरवाइजर यूयूआईडी "ec2" से भी शुरू होता है। ऐसा होने का मौका 40 9 6 में 1 है जो नगण्य नहीं है। - Hannes
असल में, पूरे यूयूआईडी की तुलना करना काम नहीं करता है क्योंकि मैंने जंगली में कई अलग-अलग हाइपरवाइजर यूयूआईडी देखे हैं। हालांकि वे सभी "ec2" से शुरू होते हैं, इसलिए यह उत्तर इस तरह काम करता है। - Hannes