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.
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.
Câu trả lời:
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 HOSTALIASES
biến môi trường. Tên trong tệp này sẽ được chọn bởi gethostbyname
(xem tài liệu ).
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ặcgethostbyname(3)
HOSTALIASES
cài đặt bị mất. ping là root setuid (vì nó cần 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.nscd
và bị giới hạn ở tên máy chủ không có dấu chấm.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
bạn có thể thấy một cái gì đó như : /usr/bin/ping = cap_net_admin,cap_net_raw+p
. Và về mặt kỹ thuật, nó cần phải mở một ổ cắm thô chứ không phải ICMP (nhưng tôi cho rằng bạn có thể tranh luận rằng đó chỉ là ngữ nghĩa).
Bên cạnh những LD_PRELOAD
mánh khóe. 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
bằng một đường dẫn 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
vào 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, vd /lib/libnss_files.so.2
)
Bây giờ, nhị phân chỉnh sửa bản sao để thay thế /etc/hosts
trong đó thành một cái gì đó có cùng độ dài /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Chỉnh sửa /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 bằng /dev/fd//3
với /etc/hosts
) và làm
exec 3< ~/hosts
Ví dụ, cho phép các lệnh khác nhau sử dụng các hosts
tệp 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à libc.so.6
và thay thế đường dẫn đến ổ cắm nscd (một cái gì đó giống như /var/run/nscd/socket
) bằng một số đường dẫn không tồn tại.
LD_LIBRARY_PATH
để trỏ đến một thư mục do người dùng sở hữu có nghĩa là bất kỳ quá trình nào khác do người dùng điều hành có thể sử dụng thư mục đó để đồng chọn bất kỳ quy trình mới nào được sinh ra bằng cách thay thế các thư viện. Và các cập nhật libnss_files.so
thông qua trình quản lý gói (bao gồm các cập nhật bảo mật) sẽ không được phản ánh trong phiên bản vá. Sửa đổi LD_LIBRARY_PATH
nói chung là một điều xấu để khuyến nghị vì những lý do khác, nhưng nó cũng không khôn ngoan vì những vấn đề đó.
Các không gian gắn kết riêng được tạo bằng unshare
lệnh có thể được sử dụng để cung cấp tệp riêng / etc / hosts cho một quy trình shell và mọi quá 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
unshare(2)
và clone(2)
đó là một phần của phép thuật ở đây. Xem thêm namespaces(7)
và user_namespaces(7)
.
Một giải pháp là để mỗi người dùng riêng biệt chroot
, vì vậy họ có thể có một người riêng biệt /etc/hosts
.
Tôi đã phả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).
Đặt sau đây ~/.bashrc
là 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ủ ~/.hosts
, lệnh sẽ thực thi như bình thường. Điều này sẽ làm việc với các cờ ban đầu 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
, hoạt động. Các ~/.hosts
tập tin cần ưu tiên hơn bất kỳ vị trí khác cho việc tìm kiếm tên máy chủ, vì vậy nếu có bất kỳ hostname dupicate, đị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]}" "$@"
}
function ping {
resolve "$@"
}
function traceroute {
resolve "$@"
}
Một ví dụ ~/.hosts
được đưa ra dưới đây. Nó theo cùng định dạng như /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
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 công 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 .bashrc
tập tin của tôi .
Ví dụ: nếu bạn đã thêm:
alias jrfbox='ssh jason@192.168.6.6'
ở dưới cùng của bạn ~/.bashrc
( ~
là thư mục 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 Entervà nó sẽ kết nối.
man ssh_config
.
~/.bashrc
, chỉ cần làm source ~/.bashrc
.
. ~/.bashrc