it-swarm-id.com

Bisakah saya membuat file host khusus pengguna untuk melengkapi / etc / hosts?

Apakah mungkin menambahkan daftar host yang hanya khusus untuk pengguna tertentu? Mungkin file host khusus pengguna?

Mekanisme ini juga harus melengkapi entri dalam /etc/hosts file.

205
redspike

Fungsi yang Anda cari diimplementasikan dalam glibc. Anda dapat mendefinisikan file host kustom dengan mengatur variabel lingkungan HOSTALIASES. Nama-nama dalam file ini akan diambil oleh gethostbyname (lihat dokumentasi ).

Contoh (diuji pada Ubuntu 13.10):

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

Beberapa batasan:

  • HOSTALIASES hanya berfungsi untuk aplikasi yang menggunakan getaddrinfo(3) atau gethostbyname(3)
  • Untuk setuid / setgid / aplikasi setcap , libc membersihkan lingkungan, yang berarti bahwa pengaturan HOSTALIASES hilang. ping adalah setuid root atau diberikan kemampuan net_raw saat eksekusi (karena perlu mendengarkan paket ICMP), jadi HOSTALIASES tidak akan bekerja dengan ping kecuali Anda sudah melakukan root sebelum Anda menelepon ping.
141
pwuertz

Di sebelah LD_PRELOAD Trik. Alternatif sederhana yang dapat bekerja pada beberapa sistem adalah mengedit biner dari perpustakaan sistem yang menangani resolusi nama host untuk menggantikan /etc/hosts dengan jalur Anda sendiri.

Misalnya, di Linux:

Jika Anda tidak menggunakan nscd, salin libnss_files.so ke beberapa lokasi Anda sendiri seperti:

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

(perpustakaan bersama mungkin berlokasi di tempat lain, mis. /lib/libnss_files.so.2)

Sekarang, edit biner salinannya untuk menggantikan /etc/hosts di sana untuk sesuatu yang panjangnya sama seperti /tmp/hosts.

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

Edit /tmp/hosts untuk menambahkan entri yang Anda inginkan. Dan gunakan

export LD_LIBRARY_PATH=~/lib

untuk nss_files untuk melihat /tmp/hosts dari pada /etc/hosts.

Dari pada /tmp/hosts, Anda juga bisa membuatnya /dev/fd//3 (di sini menggunakan dua garis miring sehingga panjang /dev/fd//3 sama dengan /etc/hosts), dan lakukan

exec 3< ~/hosts

Misalnya yang akan memungkinkan perintah yang berbeda menggunakan file hosts berbeda.

Jika nscd diinstal dan dijalankan, Anda dapat memintasnya dengan melakukan trik yang sama, tetapi kali ini untuk libc.so.6 dan ganti path ke soket nscd (sesuatu seperti /var/run/nscd/socket) dengan beberapa jalur yang tidak ada.

44

Ruang mount pribadi yang dibuat dengan perintah unshare dapat digunakan untuk menyediakan file pribadi/etc/hosts ke proses Shell dan proses anak selanjutnya dimulai dari Shell tersebut.

# 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

Saya menghadapi kebutuhan yang sama, jadi saya mencoba libnss-userhosts, tetapi gagal pada aplikasi multithreaded. Karena itu saya telah menulis libnss-homehosts . Ini sangat baru dan hanya diuji oleh saya. Anda mungkin memberi kesempatan untuk itu! Ini mendukung beberapa opsi di /etc/Host.conf, beberapa nama alias, dan penyelesaian terbalik (alamat ke nama).

6
bandie

Salah satu solusinya adalah memiliki masing-masing pengguna dalam chroot yang terpisah, sehingga masing-masing dapat memiliki /etc/hosts Terpisah untuk diri mereka sendiri.

6
Pletiplot

Menempatkan yang berikut ini dalam ~/.bashrc bekerja untuk saya di bash. Itu mengubah nama host di perintah menjadi alamat berdasarkan pada entri di ~/.hosts. Jika ~/.hosts tidak ada atau jika nama host tidak dapat ditemukan di ~/.hosts, perintah dijalankan seperti biasa. Ini harus bekerja dengan flag asli dari fungsi yang relevan dan tidak mengetahui di mana nama host ditempatkan relatif terhadap flag, mis. ping -i 0.5 Host1 -c 3, berhasil. ~/.hosts file lebih disukai daripada lokasi lain untuk menemukan nama host, jadi jika ada nama host duplikat, alamat di ~/.hosts akan digunakan.

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

Contoh dari ~/.hosts diberikan di bawah ini. Ini mengikuti format yang sama dengan /etc/hosts. Komentar dan spasi putih ditangani dengan benar.

$ 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

Tidak yakin apakah ini akan membantu Anda, tetapi saya datang ke sini mencari cara untuk menambahkan "host" yang disimpan di tempat yang mudah diakses hanya oleh pengguna saya.

Saya pada dasarnya perlu untuk ssh ke kotak-kotak tertentu di jaringan kerja kami, yang hanya memiliki satu titik masuk.

Apa yang saya lakukan adalah menambahkan alias ke file .bashrc Saya.

Misalnya, jika Anda menambahkan:

alias jrfbox='ssh [email protected]' 

di bagian bawah ~/.bashrc Anda [~ adalah direktori home Anda). Kemudian setelah Anda keluar dan masuk lagi, Anda dapat mengetik jrfbox, tekan Enter, dan itu akan terhubung.

2
Jason