เป็นไปได้หรือไม่ที่จะเพิ่มรายการโฮสต์ที่เฉพาะเจาะจงกับผู้ใช้บางคน? อาจเป็นไฟล์โฮสต์ที่เฉพาะเจาะจงของผู้ใช้?
กลไกนี้ควรเสริมรายการใน/etc/hosts
ไฟล์
เป็นไปได้หรือไม่ที่จะเพิ่มรายการโฮสต์ที่เฉพาะเจาะจงกับผู้ใช้บางคน? อาจเป็นไฟล์โฮสต์ที่เฉพาะเจาะจงของผู้ใช้?
กลไกนี้ควรเสริมรายการใน/etc/hosts
ไฟล์
คำตอบ:
ฟังก์ชั่นที่คุณกำลังมองหาถูกนำมาใช้ใน glibc คุณสามารถกำหนดไฟล์โฮสต์ที่กำหนดเองโดยการตั้งค่า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
ตั้งค่าจะหายไป pingเป็น setuid root (เพราะจำเป็นต้องฟังแพ็คเก็ต ICMP) ดังนั้นHOSTALIASES
จะไม่ทำงานกับ ping จนกว่าคุณจะรูทแล้วก่อนที่คุณจะเรียก pingnscd
และ จำกัด ชื่อโฮสต์โดยไม่มีจุด
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
ด้วยเส้นทางของคุณเอง
ตัวอย่างเช่นบน Linux:
หากคุณไม่ได้ใช้งาน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
โดยทั่วไปเป็นสิ่งที่ไม่ดีที่จะแนะนำด้วยเหตุผลอื่น แต่ก็ไม่ฉลาดเพราะปัญหาเหล่านั้น
Private mountspaces ที่สร้างด้วยunshare
คำสั่งสามารถใช้เพื่อจัดเตรียมไฟล์ private / etc / hosts ให้กับกระบวนการเชลล์และกระบวนการลูกที่ตามมาใด ๆ ที่เริ่มต้นจากเชลล์นั้น
# 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 แต่มันล้มเหลวในแอพพลิเคชั่นแบบมัลติเธรด ดังนั้นผมจึงได้เขียนlibnss-homehosts มันใหม่มากและทดสอบโดยฉันเท่านั้น คุณอาจให้โอกาสมัน! สนับสนุนตัวเลือกบางอย่างใน /etc/host.conf ชื่อนามแฝงหลายชื่อและการแก้ไขแบบย้อนกลับ (address to name)
การวางสิ่งต่อไปนี้ใน~/.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