क्या मैं पूरक / आदि / होस्ट करने के लिए एक उपयोगकर्ता-विशिष्ट होस्ट फ़ाइल बना सकता हूं?


192

क्या उन मेजबानों की सूची को जोड़ना संभव है जो केवल एक निश्चित उपयोगकर्ता के लिए विशिष्ट हैं? शायद एक उपयोगकर्ता-विशिष्ट होस्ट फ़ाइल?

इस तंत्र को /etc/hostsफ़ाइल में प्रविष्टियों का पूरक होना चाहिए ।


2
ठीक है, आप इसके बजाय स्वयं नेमसर्वर चला सकते हैं, और उपयोगकर्ता के लिए प्रति उपयोगकर्ता-विशिष्ट resolv.conf के अलग-अलग नेमसर्वर का उपयोग करें - उपयोगकर्ता-विशिष्ट resolv.conf बनाने के अलावा उपयोगकर्ता-विशिष्ट / आदि / होस्ट बनाने में उतना ही मुश्किल प्रतीत होता है।
एसएफ।

2
यदि सर्वर दूरस्थ है, तो आप ~ / .ssh / config फ़ाइल आज़मा सकते हैं: यह पोस्ट
अहिजाज़ा

जवाबों:


133

आप जिस कार्यशीलता की तलाश कर रहे हैं वह ग्लिब में लागू है। आप HOSTALIASESवातावरण चर सेट करके एक कस्टम होस्ट फ़ाइल को परिभाषित कर सकते हैं । इस फ़ाइल में नाम gethostbyname( प्रलेखन देखें ) द्वारा उठाया जाएगा ।

उदाहरण (Ubuntu 13.10 पर परीक्षण):

$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null

कुछ सीमाएँ:

  • HOSTALIASESकेवल उपयोग करने getaddrinfo(3)वाले अनुप्रयोगों के लिए काम करता है याgethostbyname(3)
  • जब setuid का उपयोग किया जाता है तो libc पर्यावरण को सुरक्षित करता है, जिसका अर्थ है कि HOSTALIASESसेटिंग खो गई है। पिंग सेटुइड रूट है (क्योंकि इसे ICMP पैकेट के लिए सुनना पड़ता है), इसलिए HOSTALIASESपिंग के साथ काम नहीं करेगा जब तक कि आप पिंग कॉल करने से पहले ही रूट नहीं हो जाते।

12
ध्यान दें कि यदि आप उपयोग कर रहे हैं nscdऔर यह बिना डॉट के होस्टनाम तक सीमित है तो यह काम नहीं करता है ।
स्टीफन चेज़लस

3
यह
kbolino

3
पार्टी के लिए देर हो चुकी है, लेकिन यह इच्छित का उलटा है, है ना? मुझे लगता है कि ओपी होस्ट-रिजॉल्विंग एंट्रीज़ को / etc / मेजबानों में जोड़ने के लिए एक समान समाधान की तलाश में है, लेकिन एक जो एस्केलेटेड विशेषाधिकारों के बिना उपयोगकर्ताभूमि में किया जा सकता है। (यानी 127.0.0.1 somedomain.com)
नूरी होजेस 18

मुझे तब याद नहीं है, लेकिन इन दिनों लिनक्स में एक बाइनरी नहीं है; यह क्षमताओं का उपयोग करता है। यदि आप दौड़ते हैं getcap /usr/sbin/pingतो आप कुछ इस तरह देख सकते हैं /usr/bin/ping = cap_net_admin,cap_net_raw+p:। और तकनीकी रूप से यह है कि इसे ICMP के बजाय एक कच्चा सॉकेट खोलने की जरूरत है (लेकिन मुझे लगता है कि आप तर्क दे सकते हैं कि यह सिर्फ शब्दार्थ है)।
प्रिएफ्टन

आदमी कहता है कि "HOSTALIASES द्वारा इंगित की गई उपनाम फ़ाइल को पहले नाम के लिए खोजा जाएगा" प्राथमिकता यादृच्छिक है और यदि इस छूट उदाहरण को एक दर्जन बार चलाते हैं तो यह गलत हो जाता है।
नकीलोन

42

बगल में LD_PRELOADचाल। एक सरल विकल्प जो कुछ सिस्टम पर काम कर सकता है, वह सिस्टम लाइब्रेरी की एक प्रति को बाइनरी-एडिट करना होगा जो होस्टनाम रिज़ॉल्यूशन को /etc/hostsआपके स्वयं के पथ से बदलने के लिए संभालती है ।

उदाहरण के लिए, लिनक्स पर:

यदि आप उपयोग नहीं कर रहे हैं nscd, तो libnss_files.soअपने स्वयं के कुछ स्थान पर कॉपी करें:

mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib

(साझा पुस्तकालय कहीं और स्थित हो सकता है, जैसे /lib/libnss_files.so.2)

अब, बाइनरी-एडिट को कॉपी करने के लिए /etc/hostsवहाँ की तरह कुछ उसी लंबाई में बदलने के लिए /tmp/hosts

perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2

/tmp/hostsइच्छित प्रविष्टि जोड़ने के लिए संपादित करें । और उपयोग करें

export LD_LIBRARY_PATH=~/lib

के बजाय nss_filesदेखने /tmp/hostsके लिए /etc/hosts

इसके बजाय /tmp/hosts, आप इसे भी बना सकते हैं /dev/fd//3(यहां दो स्लैश का उपयोग कर रहे हैं ताकि लंबाई /dev/fd//3समान हो /etc/hosts), और करें

exec 3< ~/hosts

उदाहरण के लिए, जो अलग-अलग कमांड को अलग-अलग hostsफ़ाइलों का उपयोग करने की अनुमति देगा ।

यदि nscdस्थापित और चल रहा है, तो आप इसे एक ही चाल से बाईपास कर सकते हैं, लेकिन इस बार libc.so.6nscd सॉकेट (कुछ ऐसा /var/run/nscd/socket) के लिए पथ को कुछ भी नहीं के साथ बदल सकते हैं।



7
बाइनरी पैचिंग के लिए +1, सुरक्षा निहितार्थ के लिए -1
पार्थियन ने शॉट

@ParthianShot, क्या सुरक्षा निहितार्थ?
स्टीफन चेजलस

1
@ StéphaneChazelas LD_LIBRARY_PATHउपयोगकर्ता द्वारा स्वामित्व वाली निर्देशिका को इंगित करने का मतलब है कि उपयोगकर्ता द्वारा चलाए जा रहे किसी भी अन्य प्रक्रिया का अर्थ है कि निर्देशिका पुस्तकालयों को प्रतिस्थापित करके किसी भी नई प्रक्रियाओं को चुनने के लिए उस निर्देशिका का उपयोग कर सकती है। और libnss_files.soपैकेज प्रबंधक के माध्यम से अद्यतन (सुरक्षा अद्यतन सहित) पैच किए गए संस्करण में परिलक्षित नहीं होगा। LD_LIBRARY_PATHआमतौर पर अन्य कारणों से सिफारिश करना एक बुरी बात है, लेकिन यह उन मुद्दों के कारण भी नासमझ है।
पार्थियन शॉट

13
@ParthianShot, गुम अपडेट के बारे में आपकी बात एक उचित बिंदु है। हालाँकि, आपके अन्य बिंदु के लिए, यदि आपके नाम पर एक दुष्ट सॉफ़्टवेयर चल रहा है, तो यह $ LD_LIBRARY_PATH में एक क्षेत्र तक पहुँच लिख रहा है, यह आपकी चिंताओं में से सबसे कम होगा क्योंकि यह पहले से ही आपके जैसे बहुत बदतर और अधिक महत्वपूर्ण क्षेत्रों तक पहुँच प्राप्त कर चुका है। .bash *, crontab, .forward, और आपके द्वारा उपयोग किए जाने वाले सभी सॉफ़्टवेयर द्वारा सभी कॉन्फ़िगरेशन फ़ाइलों (जहां यह उदाहरण के लिए LD_ {PRELOAD, LIBRARY_PATH} सेट कर सकता है, लेकिन आमतौर पर बहुत बुरा होगा)
स्टीफन चेज़लस

24

unshareकमांड के साथ बनाई गई निजी mountspaces का उपयोग शेल प्रक्रिया के लिए एक निजी / etc / मेजबान फ़ाइल प्रदान करने के लिए किया जा सकता है और किसी भी बाद के बच्चे की प्रक्रिया उस शेल से शुरू होती है।

# Start by creating your custom /etc/hosts file
[user] cd ~
[user] cat >my_hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk
EOF

[user] sudo unshare --mount
# We're now running as root in a private mountspace. 
# Any filesystem mounts performed in this private mountspace
# are private to this shell process and its children

# Use a bind mount to install our custom hosts file over /etc/hosts
[root] mount my_hosts /etc/hosts --bind

[root] cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk

[root] exec su - appuser

[appuser] # Run your app here that needs a custom /etc/hosts file

[appuser] ping news.bbc.co.uk
PING news.bbc.co.uk (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.026 ms
^C
--- news.bbc.co.uk ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.044/0.062/0.018 ms

3
रुको। मुझे लगा कि निर्देशिकाओं (आरोह बिंदुओं) पर बस माउंट किए गए फाइल सिस्टम को माउंट करें। मुझे नहीं पता था कि एक फाइल दूसरी फाइल पर लगाई जा सकती है। क्या यह वास्तव में काम करता है? (मैं इसे गंभीरता से पूछ रहा हूं। यह व्यंग्य नहीं है।)
हत्यारे

5
हां, यह काम करता है, आप --bind के साथ किसी अन्य फ़ाइल पर फ़ाइल माउंट कर सकते हैं।
नवंबर को

बस उन उत्सुक लोगों के लिए एक नोट के रूप में: यह नामस्थान के साथ करना है; वहाँ syscalls हैं unshare(2)और clone(2)यह यहाँ जादू का हिस्सा है। यह भी देखें namespaces(7)और user_namespaces(7)
प्रिएफ्टन

5

एक समाधान प्रत्येक उपयोगकर्ता को एक अलग में रखना है chroot, इसलिए वे प्रत्येक /etc/hostsको खुद से अलग कर सकते हैं।


3
यह एक उत्तर हो सकता है, लेकिन जैसा कि थोड़ी व्याख्या के साथ कहा गया है कि यह टिप्पणी के रूप में अधिक अनुकूल है
एंथन

2
खैर ... हाँ, यह उल्लेखनीय है। हालांकि इस तरह की चीज़ के लिए चिरोटिंग एक बहुत भारी शुल्क है। और इसके साथ मुद्दों का अपना सेट लाता है।
पार्थियन शॉट

5

मुझे उसी जरूरत का सामना करना पड़ा, इसलिए मैंने libnss-userhosts की कोशिश की, लेकिन यह मल्टीथ्रेड अनुप्रयोगों पर विफल रहता है। इसलिए मैंने लिबास-होमहोस्ट लिखा है । यह बहुत नया है और मेरे द्वारा ही परखा गया है। आप इसके लिए एक मौका दे सकते हैं! यह कुछ विकल्पों का समर्थन करता है /etc/host.conf, कई अन्य नाम, और रिवर्स रिज़ॉल्यूशन (नाम से पता)।


1
यह एक अच्छा विचार है कि लिबास के रख-रखाव और / या वितरण अनुरक्षकों को पिच करने के लिए एक अच्छा विचार है। लेकिन ऐसा होने से पहले, रूट के बिना उपयोगकर्ता स्वयं इसका उपयोग नहीं कर पाएंगे। फिर भी, +1
einpoklum

3

निम्नलिखित को स्थान देना ~/.bashrcमेरे लिए काम है। यह कमांड में होस्टनाम को प्रविष्टियों के आधार पर एक पते में परिवर्तित करता है ~/.hosts। यदि ~/.hostsमौजूद नहीं है या होस्टनाम में नहीं पाया जा सकता है ~/.hosts, तो कमांड सामान्य रूप से निष्पादित होता है। यह संबंधित फ़ंक्शंस के मूल झंडे के साथ काम करना चाहिए और इसके बावजूद कि होस्टनाम को झंडे के सापेक्ष रखा गया है, जैसे ping -i 0.5 host1 -c 3, काम करता है। ~/.hostsफ़ाइल होस्ट नामों को खोजने के लिए किसी अन्य स्थान की तुलना में प्राथमिकता देती है, इसलिए अगर कोई dupicate होस्ट नाम हैं, में पता ~/.hostsइस्तेमाल किया जाएगा।

$ cat ~/.bashrc 
function resolve {
        hostfile=~/.hosts
        if [[ -f "$hostfile" ]]; then
                for arg in $(seq 1 $#); do
                        if [[ "${!arg:0:1}" != "-" ]]; then
                                ip=$(sed -n -e "/^\s*\(\#.*\|\)$/d" -e "/\<${!arg}\>/{s;^\s*\(\S*\)\s*.*$;\1;p;q}" "$hostfile")
                                if [[ -n "$ip" ]]; then
                                        command "${FUNCNAME[1]}" "${@:1:$(($arg-1))}" "$ip" "${@:$(($arg+1)):$#}"
                                        return
                                fi
                        fi
                done
        fi
        command "${FUNCNAME[1]}" "$@"
}

function ping {
        resolve "$@"
}

function traceroute {
        resolve "$@"
}

इसका एक उदाहरण ~/.hostsनीचे दिया गया है। यह उसी प्रारूप का अनुसरण करता है जैसे /etc/hosts। टिप्पणियाँ और व्हॉट्सएप को सही तरीके से संभाला जाता है।

$ cat ~/.hosts 
# addresses and hostnames
stackexchange.com se

192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login

क्या git या wget इस "समाधान" का उपयोग कर सकते हैं? या सिर्फ आपका फ़ंक्शन जो फ़ंक्शन "रिज़ॉल्यूशन" का उपयोग करता है?
किंसी

2

यकीन नहीं होता कि यह आपकी मदद करेगा, लेकिन मैं यहां "मेजबानों" को बचाने के लिए एक रास्ता ढूंढ रहा हूं, जो केवल मेरे उपयोगकर्ता के लिए आसानी से सुलभ था।

मुझे मूल रूप से हमारे कार्य नेटवर्क पर कुछ बक्से में ssh करने में सक्षम होना चाहिए, जिसमें केवल एक प्रवेश बिंदु है।

मैंने जो कुछ किया वह मेरी .bashrcफ़ाइल में उपनाम जोड़ रहा था ।

उदाहरण के लिए, यदि आपने जोड़ा है:

alias jrfbox='ssh jason@192.168.6.6' 

आपके नीचे ~/.bashrc( ~आपके घर निर्देशिका है)। फिर आपके लॉगआउट करने और फिर से लॉगिन करने के बाद, आप टाइप कर सकते हैं jrfbox, हिट कर सकते हैं Enter, और यह कनेक्ट हो जाएगा।


14
यदि आप विशेष रूप से एसएसएच मामले में दिलचस्प हैं, तो आपको देखना चाहिए man ssh_config
निक

1
आपको फिर से लोड करने के लिए लॉग आउट करने और वापस करने की आवश्यकता नहीं है ~/.bashrc, बस करो source ~/.bashrc
user991710

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