/ Etc / hosts dosyasını tamamlamak için kullanıcıya özel bir host dosyası oluşturabilir miyim?


192

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/hostsdosyadaki girişleri de tamamlamalıdır .


2
peki, bunun yerine kendi ad sunucularını çalıştırabilir ve kullanıcının kullanıcıya özgü her adreste farklı ad sunucusu kullanmasını sağlayabilirsiniz - kullanıcıya özel çözüm.
SF.

2
Sunucu uzaksa, ~ / .ssh / config dosyasını deneyebilirsiniz: bu gönderi .
aaiezza,

Yanıtlar:


133

Aradığınız işlevsellik glibc'de uygulanır. HOSTALIASESOrtam 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:

  • HOSTALIASESsadece getaddrinfo(3)veyagethostbyname(3)
  • Ne zaman Setuid kullanıldığı libc anlamına gelir çevreyi sanitizes HOSTALIASESayar kaybolur. ping setuid root'tur (çünkü ICMP paketlerini dinlemek zorundadır), HOSTALIASESping çağırmadan önce root olmadıkça ping ile çalışmaz.

12
Kullanıyorsanız nscdve nokta içermeyen ana bilgisayar adlarıyla sınırlıysa çalışmadığını unutmayın .
Stéphane Chazelas

3
Bu, CentOS 6
kbolino

3
Partiye geç kaldık, ama bu istenenin tersi, değil mi? OP'nin / etc / hosts dosyasına ana bilgisayar çözümleyici girişler eklenmesine benzer bir çözüm aradığını düşünüyorum, ancak bu kullanıcılara artan ayrıcalıklar olmadan yapılabilecek bir çözüm. (yani 127.0.0.1 somedomain.com)
Nuri Hodges,

O zamanları hatırlamıyorum ama bugünlerde ping Linux'taki bir ikili dosya değil; yeteneklerini kullanır. Eğer çalıştırırsanız getcap /usr/sbin/pinggibi 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).
Pryftan

Adama göre "HOSTALIASES 'in işaret ettiği takma ad ilk önce isimle aranacak" demesine rağmen, öncelik rastgele ve eğer bu wget örneğini çalıştırırsanız bir düzine yanlış gider.
Nakilon

42

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 nscdkopyalayı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/hostsorada 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/hostsistediğiniz girdiyi ekleyin. Ve kullan

export LD_LIBRARY_PATH=~/lib

yerine nss_filesbakmak 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//3bir aynıdır /etc/hosts) ve do

exec 3< ~/hosts

Örneğin, farklı komutların farklı hostsdosyalar kullanmasına izin verecek .

Eğer nscdyü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/socketbazı varolmayan yolu ile).



7
İkili yama için +1, güvenlik uygulamaları için -1
Parthian Shot

@ParthianShot, hangi güvenlik çıkarımları?
Stéphane Chazelas

1
@ StéphaneChazelas LD_LIBRARY_PATHKullanı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.soPaket 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.
Parthian Shot,

13
@ParthianShot, eksik güncellemelerle ilgili noktanız adil bir nokta. Bununla birlikte, diğer nokta için, eğer sizin adınıza hileli bir yazılım çalışıyorsa, $ LD_LIBRARY_PATH alandaki bir alana yazma erişiminiz olması, sizinki gibi çok daha kötü ve daha güvenilir alanlara yazma erişimi olduğundan, endişelerinizin en azı olacaktır. .bash *, crontab, .forward ve tüm konfigürasyon dosyalarını kullandığınız tüm yazılımlara göre (örneğin LD_ {PRELOAD, LIBRARY_PATH} ayarlayabilse de genellikle daha da kötüsünü yapabilirdi)
Stéphane Chazelas

24

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

3
Bekle. Ben sadece mount dosya sistemlerini dizinlere yerleştirmiştim (mount noktaları). Bir dosyanın başka bir dosyaya eklenebileceğini bilmiyordum. Bu gerçekten işe yarıyor mu? (Bunu ciddiye istiyorum. Bu iğneleme değil.)
katilist,

5
Evet, işe yarıyor, bir dosyayı --bind ile başka bir dosyanın üzerine bağlayabilirsiniz.
frielp

Tıpkı meraklılara bir not olarak: bu isim alanları ile ilgilidir; orada sistemler var unshare(2)ve clone(2)bu da sihrin bir parçası. Ayrıca bakınız namespaces(7)ve user_namespaces(7).
Pryftan

5

Bir çözüm, her kullanıcının ayrı olarak sahip olması chroot, böylece her birinin /etc/hostskendilerine ayrı ayrı sahip olmalarıdır .


3
Bu bir cevap olabilir, ancak küçük açıklamalarla belirtildiği gibi bir yorum olarak daha uygundur
Anthon

2
Şey ... evet, yapılabilir. Her ne kadar chrooting bu tür bir şey için oldukça ağır bir çözüm olsa da. Ve onunla birlikte kendi meselelerini de beraberinde getiriyor.
Parthian Shot

5

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.


1
Bu, uzmanların bakıcılarına ve / veya dağıtımcılarına atlamak için iyi bir fikir gibi görünüyor. Ancak bu olmadan önce, kökleri olmayan kullanıcılar onu kullanamazlar. Yine de, +1
einpoklum

3

Aşağıdakileri yerleştirmek ~/.bashrcbash 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 ~/.hostsyoksa 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 3eserler ile çalışmalıdır. ~/.hostsDosya ana bilgisayar adlarını bulmak için başka bir konumda göre önceliğe sahiptir, bu nedenle herhangi bir dupicate hostnames varsa, adres ~/.hostskullanı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 ~/.hostsaş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

Git veya wget bu "çöz" özelliğini kullanabilir mi? Ya da sadece "çözüm" işlevini kullanan işleviniz?
Qinsi

2

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.


14
Özellikle SSH davasında ilgiliyseniz, görmelisiniz man ssh_config.
Nick,

1
Yeniden yüklemek için oturumu kapatıp tekrar açmak zorunda değilsiniz ~/.bashrc, basitçe yapın source ~/.bashrc.
user991710

1
@ user991710 Veya bunun için. ~/.bashrc
Pryftan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.