/ etc / होस्ट्स फ़ाइल एक और कॉन्फ़िगरेशन फ़ाइल को संदर्भित करती है


37

/etc/hostsमेजबानों की सूची के लिए मुझे दूसरी कॉन्फ़िगरेशन फ़ाइल को संदर्भित करने के लिए फ़ाइल कैसे मिल सकती है?

उदाहरण /etc/hosts:

 ## My Hosts
 127.0.0.1   localhost
 255.255.255.255 broadcasthost

 #Other Configurations
 <Link to /myPath/to/MyConfig/ConfigFile.txt>

 #Other Addresses
 3.3.3.3 MyAwesomeDomain.com
 4.4.4.4 SomeplaceIWantToGoTo.com

ConfigFile.txt

##My additional Hosts
1.1.1.1 SomeLocation.com
2.2.2.2 AnotherLocation.com

मैं /etc/hostsफ़ाइल के लिए एक लिंक / संदर्भ कैसे जोड़ूं जो configFile.txt लोड हो जाएगा?

जवाबों:


39

आप नहीं कर सकते। के लिए प्रारूप /etc/hostsकाफी सरल है, और अतिरिक्त फ़ाइलों सहित समर्थन नहीं करता है।

इसके बजाय आप उपयोग कर सकते हैं एक दो दृष्टिकोण हैं:

  • एक (संभवतः स्थानीय-केवल) DNS सर्वर सेट करें। इनमें से कुछ बहुत अधिक लचीलापन देते हैं, और आप निश्चित रूप से कई फ़ाइलों या यहां तक ​​कि मशीनों पर अपने होस्ट फ़ाइलों को फैला सकते हैं। अन्य (जैसे कि dnsmasq) कम (लेकिन अभी भी पर्याप्त) लचीलेपन की पेशकश करते हैं, लेकिन स्थापित करना आसान है। यदि आप मशीनों की एक गुच्छा पर मेजबानों की एक ही सूची को शामिल करने की कोशिश कर रहे हैं, तो DNS शायद सही उत्तर है।

  • कुछ अन्य नाम सेवा (NIS, LDAP, आदि) सेट करें। समर्थित है के लिए glibc एनएसएस डॉक्स की जाँच करें। व्यक्तिगत रूप से, मुझे लगता है कि आपको अधिकांश मामलों में DNS का उपयोग करना चाहिए।

  • अपने आप को एक /etc/hosts.dनिर्देशिका या समान बनाएं , और उन सभी को एक साथ मिलाने के लिए कुछ स्क्रिप्ट लिखें (सबसे तुच्छ:, cat /etc/hosts.d/*.conf > /etc/hostsहालांकि, आप शायद थोड़ा बेहतर करना चाहते हैं जैसे, वर्तमान लोकेल द्वारा डिफ़ॉल्ट सॉर्ट को ओवरराइड करना), और बूट पर उस स्क्रिप्ट को चलाना, या जब भी आप फ़ाइलों को अपडेट करते हैं, क्रोन या मैन्युअल रूप से।

व्यक्तिगत रूप से, घर और काम दोनों में, हर डिवाइस से मशीन के नाम को फिर से उपयोग करने योग्य होने के लिए, मैं BIND 9 चलाता हूं। हालांकि, सीखने के लिए कुछ घंटे शामिल हैं।


धन्यवाद! मैं सोच रहा था कि प्रत्येक प्रयास विफल क्यों हो रहा था। यह बहुत आसान होगा यदि यह संभव था, लेकिन मैं /etc/hosts.d का उपयोग
करूंगा

8
@DogEatDog मैं स्थानीय DNS सर्वर चलाने की सलाह देता हूं। Dnsmasq को स्थापित करना बहुत आसान है; उपयोगकर्ता के अनुकूल वितरण पर, आप पैकेज स्थापित करते हैं और यह सिर्फ काम करता है।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स के पास यह अधिकार है - dnsmasq संभवतः एक होम नेटवर्क पर आप जो चाहते हैं वह करता है। यह मैक पते द्वारा आपके सभी LAN संसाधनों को स्थिर IP असाइन करने देता है, उन्हें होस्टनाम प्रदान करता है, और उनके लिए अनुरोधों को हल करता है - सभी जबकि अज्ञात होस्ट को एक अपस्ट्रीम DNS सर्वर से गुजरने देता है।
मूडबूम

@ मडबूम एंड गाइल्स सुझाव देने के लिए धन्यवाद, मैंने उत्तर में इसे नोट किया है। यकीन नहीं होता कि मैं 2013 में वापस dnsmasq का उपयोग कर रहा था, लेकिन मैं निश्चित रूप से अब हूं।
derobert

ग्लोब विस्तार को छांटा जाता है (कम से कम बाश में, के अनुसार LC_COLLATE), इसलिए आपके उत्तर में चेतावनी लागू नहीं होती है।
l0b0

2

यह संभव नहीं है, क्योंकि प्रारूप को आमतौर पर प्लेटफार्मों के लिबास में गहराई से कोडित किया जाता है। लेकिन यह है कि एक OS इस सुविधा कहते हैं, यह एक गैर पार मंच समाधान बन कल्पना।

वैकल्पिक रूप से, आप अपने होस्ट फ़ाइल में एक निश्चित ब्लॉक को स्वचालित रूप से अपडेट कर सकते हैं। यह विशेष रूप से उपयोगी है यदि आपके पास एक स्क्रिप्ट है जो गतिशील रूप से एक निश्चित परियोजना के लिए मेजबान प्रविष्टियों को आउटपुट करती है (संभवतः बदलते आईपी के साथ)।

यहाँ एक उदाहरण दिया गया है: आप टेराफॉर्म राज्य से मेजबान बनाना चाहते हैं terraform-inventory

प्रासंगिक इन्वेंट्री आउटपुट (उदाहरण के लिए, एक EC2 "नाम" का मानचित्रण, प्रत्येक एक मेजबान के समूहों के लिए टैग करना):

$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
  "name_myhost-a": [
    "10.101.118.131"
  ],
  "name_myhost-b": [
    "10.101.111.189"
  ]
}

print-updated-hosts-entries.sh

#!/bin/sh
exec terraform-inventory --list | \
    jq -r 'to_entries |
           map(select(.key | match("^name_"))) |
           map(.value[0] + " " + .key[5:]) |
           join("\n")'

स्क्रिप्ट आउटपुट:

./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b

और कमांड लाइन /etc/hostsस्क्रिप्ट आउटपुट के साथ एक चिह्नित ब्लॉक को अपडेट करने के लिए :

sudo cp /etc/hosts "/etc/hosts.bak.$(date +%Y%m%d%H%M%S)" && \
    (
        sed -n '1,/^# MYMARKER BEGIN/{/^# MYMARKER BEGIN/!p;}' /etc/hosts; \
        echo "# MYMARKER BEGIN"; \
        ./print-updated-hosts-entries.sh; \
        echo "# MYMARKER END"; \
        sed -n '/^# MYMARKER END/,${/^# MYMARKER END/!p;}' /etc/hosts; \
    ) | \
    sudo tee /etc/hosts.new | \
    sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' && \
        sudo mv /etc/hosts.new /etc/hosts

स्पष्टीकरण:

  • पहली पंक्ति स्पष्ट रूप से एक बैकअप बनाती है
  • कोष्ठक में उपखंड में sedमार्कर शुरू / समाप्त होने से पहले और बाद में सभी लाइनों को प्रिंट करने के लिए दो कॉल हैं। हम किसी भी मामले में मार्करों को सम्मिलित करते हैं, उन पंक्तियों के बीच में स्क्रिप्ट आउटपुट डालते हैं। यदि स्क्रिप्ट विफल हो जाती है, तब भी हमें /etc/hosts(और भयावह परिदृश्य में बैकअप) की सामग्री को घेरना होगा ।
  • sudo tee /etc/hosts.new एक नई फ़ाइल में पाइप की गई सामग्री को लिखता है
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' सुविधा के लिए अद्यतन ब्लॉक प्रिंट करता है
  • sudo mv /etc/hosts.new /etc/hostsजगह में नई फ़ाइल ले जाता है। यह एक अलग चरण में किया जाना चाहिए क्योंकि यदि पाइप बफर अंतरिक्ष से बाहर निकलता है, tee /etc/hostsतो फ़ाइल लिखना शुरू कर देगा , जबकि मौजूदा सामग्री अभी भी पढ़ी जा रही है।

1

मुझे गतिशील आईपी के साथ विभिन्न स्थानों से मूल रूप से काम करने के लिए मेरे लिए समान आवश्यकता थी, खासकर जब से मैं आभासी मशीनों का उपयोग करता हूं। मेरा सरल समाधान इस प्रकार है:

  1. प्रत्येक इकाई के लिए होस्ट प्रविष्टियों को अद्यतन करने के लिए एक स्क्रिप्ट बनाएं। उदाहरण के लिए, यदि मेरे पास उप-डोमेन 'app.myhost.net' के साथ 'myhost.net' नामक एक होस्ट है, तो मैं उस स्क्रिप्ट को आमंत्रित करूंगा और एक आईपी पते की आपूर्ति करूंगा जो प्रत्येक डोमेन के लिए लिखा जाएगा और जिसे होस्ट फ़ाइल में सहेजा जाएगा 'मेरा मेजबान'। एक ही स्क्रिप्ट में एकल होस्ट फ़ाइल को हटाने या अपडेट करने के लिए एक ध्वज होता है।

  2. उन फ़ाइलों को / etc / Host में मर्ज करने के लिए एक और स्क्रिप्ट बनाएँ। यह स्क्रिप्ट आपके द्वारा बनाई गई सभी होस्ट फ़ाइलों को खोजेगी और उन्हें / etc / मेजबान पर सिंगल होस्ट फ़ाइल में मर्ज करेगी।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.