क्या उन मेजबानों की सूची को जोड़ना संभव है जो केवल एक निश्चित उपयोगकर्ता के लिए विशिष्ट हैं? शायद एक उपयोगकर्ता-विशिष्ट होस्ट फ़ाइल?
इस तंत्र को /etc/hosts
फ़ाइल में प्रविष्टियों का पूरक होना चाहिए ।
क्या उन मेजबानों की सूची को जोड़ना संभव है जो केवल एक निश्चित उपयोगकर्ता के लिए विशिष्ट हैं? शायद एक उपयोगकर्ता-विशिष्ट होस्ट फ़ाइल?
इस तंत्र को /etc/hosts
फ़ाइल में प्रविष्टियों का पूरक होना चाहिए ।
जवाबों:
आप जिस कार्यशीलता की तलाश कर रहे हैं वह ग्लिब में लागू है। आप HOSTALIASES
वातावरण चर सेट करके एक कस्टम होस्ट फ़ाइल को परिभाषित कर सकते हैं । इस फ़ाइल में नाम gethostbyname
( प्रलेखन देखें ) द्वारा उठाया जाएगा ।
उदाहरण (Ubuntu 13.10 पर परीक्षण):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
कुछ सीमाएँ:
HOSTALIASES
केवल उपयोग करने getaddrinfo(3)
वाले अनुप्रयोगों के लिए काम करता है याgethostbyname(3)
HOSTALIASES
सेटिंग खो गई है। पिंग सेटुइड रूट है (क्योंकि इसे ICMP पैकेट के लिए सुनना पड़ता है), इसलिए HOSTALIASES
पिंग के साथ काम नहीं करेगा जब तक कि आप पिंग कॉल करने से पहले ही रूट नहीं हो जाते।nscd
और यह बिना डॉट के होस्टनाम तक सीमित है तो यह काम नहीं करता है ।
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
तो आप कुछ इस तरह देख सकते हैं /usr/bin/ping = cap_net_admin,cap_net_raw+p
:। और तकनीकी रूप से यह है कि इसे ICMP के बजाय एक कच्चा सॉकेट खोलने की जरूरत है (लेकिन मुझे लगता है कि आप तर्क दे सकते हैं कि यह सिर्फ शब्दार्थ है)।
बगल में 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.6
nscd सॉकेट (कुछ ऐसा /var/run/nscd/socket
) के लिए पथ को कुछ भी नहीं के साथ बदल सकते हैं।
LD_LIBRARY_PATH
उपयोगकर्ता द्वारा स्वामित्व वाली निर्देशिका को इंगित करने का मतलब है कि उपयोगकर्ता द्वारा चलाए जा रहे किसी भी अन्य प्रक्रिया का अर्थ है कि निर्देशिका पुस्तकालयों को प्रतिस्थापित करके किसी भी नई प्रक्रियाओं को चुनने के लिए उस निर्देशिका का उपयोग कर सकती है। और libnss_files.so
पैकेज प्रबंधक के माध्यम से अद्यतन (सुरक्षा अद्यतन सहित) पैच किए गए संस्करण में परिलक्षित नहीं होगा। LD_LIBRARY_PATH
आमतौर पर अन्य कारणों से सिफारिश करना एक बुरी बात है, लेकिन यह उन मुद्दों के कारण भी नासमझ है।
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
unshare(2)
और clone(2)
यह यहाँ जादू का हिस्सा है। यह भी देखें namespaces(7)
और user_namespaces(7)
।
एक समाधान प्रत्येक उपयोगकर्ता को एक अलग में रखना है chroot
, इसलिए वे प्रत्येक /etc/hosts
को खुद से अलग कर सकते हैं।
मुझे उसी जरूरत का सामना करना पड़ा, इसलिए मैंने libnss-userhosts की कोशिश की, लेकिन यह मल्टीथ्रेड अनुप्रयोगों पर विफल रहता है। इसलिए मैंने लिबास-होमहोस्ट लिखा है । यह बहुत नया है और मेरे द्वारा ही परखा गया है। आप इसके लिए एक मौका दे सकते हैं! यह कुछ विकल्पों का समर्थन करता है /etc/host.conf, कई अन्य नाम, और रिवर्स रिज़ॉल्यूशन (नाम से पता)।
निम्नलिखित को स्थान देना ~/.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
यकीन नहीं होता कि यह आपकी मदद करेगा, लेकिन मैं यहां "मेजबानों" को बचाने के लिए एक रास्ता ढूंढ रहा हूं, जो केवल मेरे उपयोगकर्ता के लिए आसानी से सुलभ था।
मुझे मूल रूप से हमारे कार्य नेटवर्क पर कुछ बक्से में ssh करने में सक्षम होना चाहिए, जिसमें केवल एक प्रवेश बिंदु है।
मैंने जो कुछ किया वह मेरी .bashrc
फ़ाइल में उपनाम जोड़ रहा था ।
उदाहरण के लिए, यदि आपने जोड़ा है:
alias jrfbox='ssh jason@192.168.6.6'
आपके नीचे ~/.bashrc
( ~
आपके घर निर्देशिका है)। फिर आपके लॉगआउट करने और फिर से लॉगिन करने के बाद, आप टाइप कर सकते हैं jrfbox
, हिट कर सकते हैं Enter, और यह कनेक्ट हो जाएगा।
man ssh_config
।
~/.bashrc
, बस करो source ~/.bashrc
।
. ~/.bashrc