यह संभव नहीं है, क्योंकि प्रारूप को आमतौर पर प्लेटफार्मों के लिबास में गहराई से कोडित किया जाता है। लेकिन यह है कि एक 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
तो फ़ाइल लिखना शुरू कर देगा , जबकि मौजूदा सामग्री अभी भी पढ़ी जा रही है।