/ Etc / ධාරක අනුපූරක කිරීම සඳහා පරිශීලක විශේෂිත ධාරක ගොනුවක් මට නිර්මාණය කළ හැකිද?


205

එක්තරා පරිශීලකයෙකුට පමණක් විශේෂිත වූ ධාරක ලැයිස්තුවක් එක් කළ හැකිද? සමහර විට පරිශීලක විශේෂිත සත්කාරක ගොනුවක්ද?

මෙම යාන්ත්‍රණය /etc/hostsගොනුවේ ඇතුළත් කිරීම් ද අනුපූරක විය යුතුය .


3
හොඳයි, ඔබට ඒ වෙනුවට තමන්ගේම නාම සේවාදායකයන් ධාවනය කළ හැකි අතර, පරිශීලක-විශේෂිත resolv.conf අනුව පරිශීලකයාට විවිධ නාම සේවාදායකයන් භාවිතා කළ හැකිය - පරිශීලක-විශේෂිත resolv.conf නිර්මාණය කිරීම හැර පරිශීලක-විශේෂිත / etc / ධාරක සෑදීම තරම්ම දුෂ්කර බව පෙනේ.
එස්.එෆ්.

3
සේවාදායකය දුරස්ථ නම්, ඔබට try / .ssh / config ගොනුව උත්සාහ කළ හැකිය: මෙම ලිපිය .
aaiezza

Answers:


141

ඔබ සොයන ක්‍රියාකාරිත්වය glibc තුළ ක්‍රියාත්මක වේ. HOSTALIASESපරිසර විචල්‍යය සැකසීමෙන් ඔබට අභිරුචි ධාරක ගොනුවක් අර්ථ දැක්විය හැකිය . මෙම ගොනුවේ නම් තෝරාගනු ලබන්නේ gethostbyname( ප්‍රලේඛනය බලන්න ).

උදාහරණය (උබුන්ටු 13.10 හි පරීක්ෂා කර ඇත):

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

සමහර සීමාවන්:

  • HOSTALIASESභාවිතා කරන යෙදුම් සඳහා පමණක් getaddrinfo(3)හෝgethostbyname(3)
  • සඳහා setuid / setgid / setcap යෙදුම්, libc sanitizes බව, ඉන් අදහස් වන්නේ පරිසරය, HOSTALIASESසැකසුම අහිමි කර ඇත. පිං සෙටූඩ් රූට් හෝ ක්‍රියාත්මක කිරීමේදී net_rawහැකියාව ලබා දී ඇත (එයට ICMP පැකට් වලට ඇහුම්කන් දිය යුතු නිසා), එබැවින් ඔබ ඇමතීමට පෙර දැනටමත් මුල් බැස ඇත්නම් මිස HOSTALIASESඑය ක්‍රියා pingනොකරනු pingඇත.

12
ඔබ භාවිතා කරන්නේ නම් එය ක්‍රියා නොකරන nscdඅතර තිතක් නොමැතිව ධාරක නාම වලට සීමා වේ.
ස්ටෙෆාන් චසෙලාස්

3
මෙය CentOS 6
kbolino

5
සාදයට ප්‍රමාදයි, නමුත් මෙය අපේක්ෂිත දෙයෙහි ප්‍රතිලෝමයයි, එසේ නොවේ ද? මම හිතන්නේ OP / etc / host සඳහා ධාරක-විසඳුම් ඇතුළත් කිරීම් එකතු කිරීමට සමාන විසඳුමක් සොයන නමුත් වැඩි වරප්‍රසාද නොමැතිව පරිශීලක භූමියේ කළ හැකි එකකි. (එනම් 127.0.0.1 somedomain.com)
නුරි හොජ්ස්

1
මිනිසා පැවසුවද, "හොස්ටාලියාස් විසින් පෙන්වා දී ඇති අන්වර්ථ ගොනුව මුලින්ම නම සොයනු ඇත" ප්‍රමුඛතාවය අහඹු වන අතර මෙම wget උදාහරණය දුසිමක් වරක් ධාවනය කළහොත් එය වැරදී යයි.
නකිලොන්

1
මැකෝස් හි ක්‍රියා නොකරයි :(
පීටර් ඩොට්චෙව්

44

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) නැති මාර්ගයක් සමඟ ප්‍රතිස්ථාපනය කරන්න .



8
ද්විමය පැච් කිරීම සඳහා +1, ආරක්ෂක ඇඟවුම් සඳහා -1
පාර්තියන් වෙඩි තැබීම

Ar පාර්තියන් ෂොට්, කුමන ආරක්ෂක ඇඟවුම් ද?
ස්ටෙෆාන් චසෙලාස්

1
@ StéphaneChazelas LD_LIBRARY_PATHපරිශීලකයාට අයත් නාමාවලියක් වෙත යොමු කිරීම වෙනස් කිරීම යන්නෙන් අදහස් කරන්නේ පරිශීලකයා විසින් මෙහෙයවනු ලබන වෙනත් ක්‍රියාවලියක් මඟින් පුස්තකාල වෙනුවට ආදේශ කිරීමෙන් ඇතිවන ඕනෑම නව ක්‍රියාවලියක් සඳහා සහයෝගය දැක්වීමට එම නාමාවලිය භාවිතා කළ හැකිය. libnss_files.soපැකේජ කළමණාකරු හරහා යාවත්කාලීන කිරීම් (ආරක්ෂක යාවත්කාලීන කිරීම් ඇතුළුව) පැච් කළ අනුවාදයේ පිළිබිඹු නොවේ. වෙනස් LD_LIBRARY_PATHකිරීම සාමාන්‍යයෙන් වෙනත් හේතූන් මත නිර්දේශ කිරීම නරක දෙයකි, නමුත් එම කරුණු නිසා එය අ wise ාන ය.
පාර්තියන් වෙඩි තැබීම

15
Ar පාර්තියන් ෂොට්, යාවත්කාලීනයන් අස්ථානගත වීම පිළිබඳ ඔබේ අදහස සාධාරණ කරුණකි. කෙසේ වෙතත්, ඔබේ අනෙක් කාරණය සඳහා, ඔබේ නමින් ව්‍යාජ මෘදුකාංගයක් ක්‍රියාත්මක වන්නේ නම්, $ LD_LIBRARY_PATH හි ප්‍රදේශයකට ලිඛිත ප්‍රවේශයක් තිබීම ඔබගේ කනස්සල්ලෙන් අවම වනු ඇත, මන්දයත් ඔබ වැනි බොහෝ නරක හා විශ්වාසදායක ප්‍රදේශවලට දැනටමත් ලිවීමේ ප්‍රවේශය ලැබී ඇති හෙයිනි. .bash *, crontab, .forward, සහ ඔබ භාවිතා කරන සියලුම මෘදුකාංග මඟින් සියලුම වින්‍යාස ගොනු (උදාහරණයක් ලෙස LD_ {PRELOAD, LIBRARY_PATH set සැකසිය හැකි නමුත් සාමාන්‍යයෙන් එය වඩාත් නරක අතට හැරෙනු ඇත)
ස්ටෙෆාන් චසෙලාස්

28

unshareවිධාන සමඟ සාදන ලද පුද්ගලික සවි කිරීම් අවකාශය ෂෙල් ක්‍රියාවලියකට පුද්ගලික / 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
ඉන්න. මම හිතුවා ගොනු පද්ධති ඩිරෙක්ටරි වලට සවි කරන්න (සවිකිරීමේ ස්ථාන). ගොනුවක් වෙනත් ගොනුවකට සවි කළ හැකි බව මම දැන සිටියේ නැත. එය සැබවින්ම ක්‍රියාත්මක වේද? (මම එය බැරෑරුම් ලෙස
අසමි

6
ඔව්, එය ක්‍රියාත්මක වේ, ඔබට --bind සමඟ වෙනත් ගොනුවක් හරහා ගොනුවක් සවි කළ හැකිය.
frielp

1
කුතුහලය දනවන අයට සටහනක් ලෙස: මෙය නම් අවකාශයන් සමඟ කළ යුතුය; සිස්කල් ඇති unshare(2)අතර clone(2)එය මෙහි මැජික් වල කොටසකි. මෙයද බලන්න namespaces(7)සහ user_namespaces(7).
Pryftan

මෙය ඇත්තෙන්ම සිසිල් ය!
මයිකොස්කොප්

එය සැබවින්ම ප්‍රයෝජනවත් විය හැකි නමුත්, පරිශීලක නාම අවකාශයන් ද විශාල ආරක්ෂක අවදානමක් වන අතර පසුගිය වසරවල සිදු වූ සූරාකෑම් ගණනාවක් පෙන්නුම් කර ඇත. මෙය ඉහත භාවිතා නොකෙරේ (එනම් ඔබට සුඩෝ අයිතිවාසිකම් අවශ්‍යයි) නමුත් සඳහන් කළ යුතුය. පෙරනිමියෙන් ඩේබියන් ඒවා අක්‍රීය කර ඇත. සලකා බැලිය යුතු තවත් දෙයක් නම්, භාවිතා කිරීම සඳහා unshareඔබ වෙනත් ක්‍රියාවලියක් ක්‍රියාත්මක කළ යුතුය. එබැවින් එය ස්වයංක්‍රීයකරණය සඳහා ෂෙල් පිටපතකට ඇතුළත් කිරීම මුළුමනින්ම සුළුපටු නොවේ. එක් ක්‍රමයක් නම් මෙහි විස්තර කර ඇති පරිදි සම්පූර්ණ කේතයමsh -c තර්කයට යොමු කිරීමයි unshare: piware.de/2012/12/…
stefanct

7

එක් විසඳුමක් නම්, එක් එක් පරිශීලකයා වෙන වෙනම සිටීමයි chroot, එබැවින් ඔවුනට වෙන වෙනම /etc/hostsසිටිය හැකිය.


3
මෙය පිළිතුරක් විය හැකි නමුත් සුළු පැහැදිලි කිරීමකින් ප්‍රකාශ කර ඇති පරිදි එය අදහස් දැක්වීමක් ලෙස වඩාත් සුදුසු වේ
ඇන්තන්

2
හොඳයි ... ඔව්, එය කළ හැකිය. Chrooting යනු මේ ආකාරයේ දෙයක් සඳහා සෑහෙන බර වැඩ විසඳුමක් වුවද. ඒ සමඟම තමන්ගේම ගැටළු සමූහයක් ගෙන එයි.
පාර්තියන් වෙඩි තැබීම

6

මම එකම අවශ්‍යතාවයකට මුහුණ දුන්නෙමි, එබැවින් මම libnss-userhosts උත්සාහ කළෙමි, නමුත් එය බහු තෙරපුම් යෙදුම් වලින් අසමත් වේ. එබැවින් මම ලිබන්ස්-හෝම්හෝස්ට් ලියා ඇත. එය ඉතා අළුත් හා පරීක්ෂා කර ඇත්තේ මා විසින් පමණි. ඔබට ඒ සඳහා අවස්ථාවක් ලබා දිය හැකිය! එය /etc/host.conf, බහු අන්වර්ථ නාම සහ ප්‍රතිලෝම විසඳීම (නමට ලිපිනය) හි සමහර විකල්ප සඳහා සහය දක්වයි.


1
මෙය ලිබන්ස් නඩත්තුකරුවන්ට සහ / හෝ බෙදාහැරීමේ නඩත්තුකරුවන්ට යොමු කිරීම හොඳ අදහසක් සේ පෙනේ. නමුත් එය සිදුවීමට පෙර, root නොමැතිව භාවිතා කරන්නන්ට එය භාවිතා කිරීමට නොහැකි වනු ඇත. තවමත්, +1
අයින්පොක්ලම්

4

පහත සඳහන් දෑ තැබීම ~/.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

මෙය ඔබට උපකාරී වේදැයි විශ්වාස නැත, නමුත් මම මෙහි පැමිණියේ මගේ පරිශීලකයාට පමණක් පහසුවෙන් ප්‍රවේශ විය හැකි කොතැනක හෝ සුරකින ලද “ධාරකයන්” එක් කිරීමට ක්‍රමයක් සොයමින්.

මට මූලිකවම අවශ්‍ය වූයේ අපගේ වැඩ ජාලයේ ඇතැම් පෙට්ටිවලට ලිස්සා යාමට හැකිවීමයි.

මම කළේ මගේ .bashrcගොනුවට අන්වර්ථ නාම එකතු කිරීමයි .

උදාහරණයක් ලෙස, ඔබ එකතු කළහොත්:

alias jrfbox='ssh jason@192.168.6.6' 

ඔබගේ පතුලේ ~/.bashrc( ~ඔබගේ නිවාස නාමාවලිය වේ). ඔබ පිටව ගොස් නැවත පුරනය වූ පසු, ඔබට ටයිප් කළ හැකිය jrfbox, පහර දෙන්න Enter, එවිට එය සම්බන්ධ වේ.


14
SSH නඩුවේදී ඔබ විශේෂයෙන් සිත්ගන්නාසුළු නම්, ඔබ දැකිය යුතුය man ssh_config.
නික්

1
නැවත පූරණය කිරීම සඳහා ඔබට පිටතට ගොස් නැවත ඇතුල් වීමට අවශ්‍ය නැත ~/.bashrc, සරලව කරන්න source ~/.bashrc.
user991710

1
@ user991710 හෝ ඒ සඳහා. ~/.bashrc
Pryftan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.