Yalnızca belirli bir kullanıcıya özel ana bilgisayar listesi eklemek mümkün müdür? Belki bir kullanıcıya özel ana bilgisayar dosyası?
Bu mekanizma /etc/hosts
dosyadaki girişleri de tamamlamalıdır .
Yalnızca belirli bir kullanıcıya özel ana bilgisayar listesi eklemek mümkün müdür? Belki bir kullanıcıya özel ana bilgisayar dosyası?
Bu mekanizma /etc/hosts
dosyadaki girişleri de tamamlamalıdır .
Yanıtlar:
Aradığınız işlevsellik glibc'de uygulanır. HOSTALIASES
Ortam değişkenini ayarlayarak özel bir ana bilgisayar dosyası tanımlayabilirsiniz . Bu dosyadaki isimler tarafından alınacaktır gethostbyname
( belgelere bakınız ).
Örnek (Ubuntu 13.10'da test edilmiştir):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Bazı sınırlamalar:
HOSTALIASES
sadece getaddrinfo(3)
veyagethostbyname(3)
HOSTALIASES
ayar kaybolur. ping setuid root'tur (çünkü ICMP paketlerini dinlemek zorundadır), HOSTALIASES
ping çağırmadan önce root olmadıkça ping ile çalışmaz.nscd
ve nokta içermeyen ana bilgisayar adlarıyla sınırlıysa çalışmadığını unutmayın .
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
gibi bir şey görebilirsiniz: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. Teknik olarak, ICMP'den ziyade ham bir soket açması gerekiyor (ama bunun sadece anlamsal olduğunu savunabilirsin sanırım).
Hilelerin yanında LD_PRELOAD
. Birkaç sistemde çalışabilecek basit bir alternatif /etc/hosts
, kendi adınızla değiştirmek üzere ana bilgisayar adı çözümlemesini işleyen sistem kitaplığının bir kopyasını ikili olarak düzenlemek olacaktır .
Örneğin, Linux'ta:
Kullanmıyorsanız , kendi konumunuza ait bir yere nscd
kopyalayın libnss_files.so
:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(paylaşılan kütüphane başka bir yerde bulunabilir, örneğin /lib/libnss_files.so.2
)
Şimdi, /etc/hosts
orada aynı uzunlukta bir şeyle değiştirmek için kopyayı ikili olarak düzenleyin /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Edit /tmp/hosts
istediğiniz girdiyi ekleyin. Ve kullan
export LD_LIBRARY_PATH=~/lib
yerine nss_files
bakmak için ./tmp/hosts
/etc/hosts
Yerine /tmp/hosts
, aynı zamanda onu yapabiliriz /dev/fd//3
(uzunluğu böylece burada iki eğik çizgi kullanarak /dev/fd//3
bir aynıdır /etc/hosts
) ve do
exec 3< ~/hosts
Örneğin, farklı komutların farklı hosts
dosyalar kullanmasına izin verecek .
Eğer nscd
yüklü ve çalışır durumdadır, aynı hile yaparak atlamak, ama bu kez olabilir libc.so.6
(gibi bir şey ve nscd sokete yolunu değiştirmek /var/run/nscd/socket
bazı varolmayan yolu ile).
LD_LIBRARY_PATH
Kullanıcının sahip olduğu bir dizine işaret etmek, kullanıcının çalıştırdığı herhangi bir işlemin, kütüphaneleri değiştirerek oluşturulan herhangi bir yeni işlemi birlikte seçmek için bu dizini kullanabileceği anlamına gelir. libnss_files.so
Paket yöneticisi aracılığıyla yapılan güncellemeler (güvenlik güncellemeleri dahil) yamalı sürüme yansıtılmaz. Değişiklik yapmak LD_LIBRARY_PATH
, genellikle başka nedenlerden dolayı önermek için kötü bir şeydir, ancak bu sorunlar nedeniyle de akıl almaz.
Komutla oluşturulan özel mountspaces unshare
, bir kabuk işlemine özel / etc / hosts dosyasını ve bu kabuktan başlayan sonraki tüm alt işlemleri sağlamak için kullanılabilir.
# 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)
ve clone(2)
bu da sihrin bir parçası. Ayrıca bakınız namespaces(7)
ve user_namespaces(7)
.
Bir çözüm, her kullanıcının ayrı olarak sahip olması chroot
, böylece her birinin /etc/hosts
kendilerine ayrı ayrı sahip olmalarıdır .
Aynı gereksinimle karşılaştım, bu yüzden libnss-userhosts'u denedim, ancak çok iş parçacıklı uygulamalarda başarısız oluyor. Bu yüzden ben libidler-ev sahibi yazdım . Çok yeni ve sadece benim tarafımdan test edildi. Bunun için bir şans verebilirsiniz! /Etc/host.conf, çoklu takma isimler ve ters çözümleme (isme adres) gibi bazı seçenekleri destekler.
Aşağıdakileri yerleştirmek ~/.bashrc
bash için benim için çalışıyor. Komuttaki ana bilgisayar adını, içindeki girişleri temel alan bir adrese dönüştürür ~/.hosts
. Eğer ~/.hosts
yoksa veya ana bilgisayar adı bulunamazsa ~/.hosts
, komut normal şekilde çalışır. Bu, ilgili fonksiyonların orijinal bayraklarıyla çalışmalı ve ana bilgisayar adının bayraklara göre yerleştirildiği yer ne olursa olsun, örneğin ping -i 0.5 host1 -c 3
eserler ile çalışmalıdır. ~/.hosts
Dosya ana bilgisayar adlarını bulmak için başka bir konumda göre önceliğe sahiptir, bu nedenle herhangi bir dupicate hostnames varsa, adres ~/.hosts
kullanılacaktır.
$ 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 "$@"
}
Bir örnek ~/.hosts
aşağıda verilmiştir. İle aynı formatı izler /etc/hosts
. Yorumlar ve boşluklar doğru şekilde ele alındı.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
Bunun size yardımcı olup olmadığından emin değilim, ancak buraya yalnızca kullanıcılarımın kolayca erişebileceği bir yere kaydedilmiş "ana bilgisayar" eklemek için bir yol aradım.
Temel olarak, sadece bir giriş noktası olan iş ağımızdaki bazı kutulara ssh yapabilmem gerekiyordu.
Yaptığım dosyama takma ad eklemek .bashrc
.
Örneğin, eklediyseniz:
alias jrfbox='ssh jason@192.168.6.6'
Altında ~/.bashrc
( ~
ana dizininiz). Sonra oturumu kapatıp tekrar giriş yaptıktan sonra yazabilir jrfbox
, vurabilir Enterve bağlanacaktır.
man ssh_config
.
~/.bashrc
, basitçe yapın source ~/.bashrc
.
. ~/.bashrc