it-swarm-vi.com

Tôi có thể tạo tệp máy chủ dành riêng cho người dùng để bổ sung / etc / hosts không?

Có thể thêm một danh sách các máy chủ chỉ dành riêng cho một người dùng nhất định không? Có lẽ một tập tin lưu trữ cụ thể người dùng?

Cơ chế này cũng sẽ bổ sung cho các mục trong /etc/hosts tập tin.

205
redspike

Các chức năng bạn đang tìm kiếm được thực hiện trong glibc. Bạn có thể xác định tệp máy chủ tùy chỉnh bằng cách đặt biến môi trường HOSTALIASES. Tên trong tệp này sẽ được chọn bởi gethostbyname (xem tài liệ ).

Ví dụ (đã thử nghiệm trên Ubuntu 13.10):

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

Một số hạn chế:

  • HOSTALIASES chỉ hoạt động cho các ứng dụng sử dụng getaddrinfo(3) hoặc gethostbyname(3)
  • Cho setuid / setgid / các ứng dụng setcap , libc vệ sinh môi trường, có nghĩa là cài đặt HOSTALIASES bị mất. ping là root setuid hoặc được cung cấp khả năng net_raw Khi thực thi (vì nó cần lắng nghe các gói ICMP), vì vậy HOSTALIASES sẽ không hoạt động với ping trừ khi bạn đã root trước khi bạn gọi ping.
141
pwuertz

Bên cạnh LD_PRELOAD thủ thuật. Một thay thế đơn giản có thể hoạt động trên một vài hệ thống sẽ là chỉnh sửa nhị phân một bản sao của thư viện hệ thống xử lý độ phân giải tên máy chủ để thay thế /etc/hosts với một con đường của riêng bạn.

Chẳng hạn, trên Linux:

Nếu bạn không sử dụng nscd, hãy sao chép libnss_files.so đến một số vị trí của riêng bạn như:

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

(thư viện dùng chung có thể được đặt ở nơi khác, ví dụ: /lib/libnss_files.so.2)

Bây giờ, nhị phân chỉnh sửa bản sao để thay thế /etc/hosts trong đó có một cái gì đó có cùng độ dài như /tmp/hosts.

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

Biên tập /tmp/hosts để thêm mục bạn muốn. Và sử dụng

export LD_LIBRARY_PATH=~/lib

cho nss_files để tìm trong /tmp/hosts thay vì /etc/hosts.

Thay vì /tmp/hosts, bạn cũng có thể làm cho nó /dev/fd//3 (ở đây sử dụng hai dấu gạch chéo sao cho độ dài của /dev/fd//3 giống như của /etc/hosts), và làm

exec 3< ~/hosts

Ví dụ, sẽ cho phép các lệnh khác nhau sử dụng các tệp hosts khác nhau.

Nếu nscd được cài đặt và chạy, bạn có thể bỏ qua nó bằng cách thực hiện cùng một mẹo, nhưng lần này là cho libc.so.6 và thay thế đường dẫn đến ổ cắm nscd (đại loại như /var/run/nscd/socket) với một số đường dẫn không tồn tại.

44
Stéphane Chazelas

Các không gian riêng tư được tạo bằng lệnh unshare có thể được sử dụng để cung cấp tệp riêng/etc/hosts cho quy trình Shell và mọi quy trình con tiếp theo bắt đầu từ Shell đó.

# 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
28
frielp

Tôi đã đối mặt với cùng một nhu cầu, vì vậy tôi đã thử libnss-userhost, nhưng nó thất bại ở các ứng dụng đa luồng. Vì vậy, tôi đã viết libnss-homehosts . Nó rất mới và chỉ được thử nghiệm bởi tôi. Bạn có thể cho một cơ hội cho nó! Nó hỗ trợ một số tùy chọn trong /etc/host.conf, nhiều tên bí danh và phân giải ngược (địa chỉ thành tên).

6
bandie

Một giải pháp là để mỗi người dùng ở một chroot riêng biệt, vì vậy mỗi người dùng có thể có một /etc/hosts Riêng.

6
Pletiplot

Đặt sau đây trong ~/.bashrc đang làm việc cho tôi trong bash. Nó chuyển đổi tên máy chủ trong lệnh thành một địa chỉ dựa trên các mục trong ~/.hosts. Nếu ~/.hosts không tồn tại hoặc nếu không thể tìm thấy tên máy chủ trong ~/.hosts, lệnh thực thi như bình thường. Điều này sẽ hoạt động với các cờ gốc của các chức năng có liên quan và không biết nơi đặt tên máy chủ liên quan đến các cờ, ví dụ: ping -i 0.5 Host1 -c 3, làm. Các ~/.hosts tập tin ưu tiên hơn bất kỳ vị trí nào khác để tìm tên máy chủ, vì vậy nếu có bất kỳ tên máy chủ trùng lặp nào, địa chỉ trong ~/.hosts sẽ được sử dụng.

$ 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]}" "[email protected]"
}

function ping {
        resolve "[email protected]"
}

function traceroute {
        resolve "[email protected]"
}

Một ví dụ của ~/.hosts được đưa ra dưới đây. Nó có cùng định dạng với /etc/hosts. Nhận xét và khoảng trắng được xử lý chính xác.

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

192.168.0.1 Host1 # this is Host1's address
login-node.inst.ac.uk login
4
Kyle Fernandes

Không chắc điều này có giúp gì cho bạn không, nhưng tôi đến đây để tìm cách thêm "máy chủ" đã lưu ở đâu đó chỉ có thể truy cập dễ dàng cho người dùng của tôi.

Về cơ bản tôi cần có thể ssh vào một số hộp nhất định trên mạng làm việc của chúng tôi, nơi chỉ có một điểm vào.

Những gì tôi đã làm là thêm bí danh vào tệp .bashrc Của tôi.

Ví dụ: nếu bạn đã thêm:

alias jrfbox='ssh [email protected]' 

ở cuối ~/.bashrc (~ là thư mục chính của bạn). Sau đó, sau khi bạn đăng xuất và đăng nhập lại, bạn có thể nhập jrfbox, nhấn Enter, và nó sẽ kết nối.

2
Jason