Apakah mungkin menambahkan daftar host yang hanya khusus untuk pengguna tertentu? Mungkin file host khusus pengguna?
Mekanisme ini juga harus melengkapi entri dalam /etc/hostsfile.
Apakah mungkin menambahkan daftar host yang hanya khusus untuk pengguna tertentu? Mungkin file host khusus pengguna?
Mekanisme ini juga harus melengkapi entri dalam /etc/hostsfile.
Jawaban:
Fungsionalitas yang Anda cari diimplementasikan dalam glibc. Anda dapat menentukan file host kustom dengan mengatur HOSTALIASESvariabel lingkungan. 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:
HOSTALIASEShanya berfungsi untuk aplikasi yang menggunakan getaddrinfo(3)ataugethostbyname(3)HOSTALIASESpengaturannya hilang. ping adalah setuid root (karena itu perlu mendengarkan paket ICMP), jadi HOSTALIASEStidak akan berfungsi dengan ping kecuali Anda sudah melakukan root sebelum menelepon ping.nscddan terbatas pada nama host tanpa titik.
127.0.0.1 somedomain.com)
getcap /usr/sbin/pingAnda mungkin melihat sesuatu seperti: /usr/bin/ping = cap_net_admin,cap_net_raw+p. Dan secara teknis itu yang dibutuhkan untuk membuka soket mentah daripada ICMP (tapi saya kira Anda bisa berdebat itu hanya semantik).
Di samping LD_PRELOADtrik. Alternatif sederhana yang dapat bekerja pada beberapa sistem adalah dengan mengedit biner pustaka sistem yang menangani resolusi nama host untuk diganti /etc/hostsdengan jalur Anda sendiri.
Misalnya, di Linux:
Jika Anda tidak menggunakan nscd, salin libnss_files.soke beberapa lokasi Anda sendiri seperti:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(perpustakaan bersama dapat ditemukan di tempat lain, misalnya /lib/libnss_files.so.2)
Sekarang, edit biner salinan untuk menggantikan /etc/hostsdi sana untuk sesuatu yang sama panjangnya /tmp/hosts.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Edit /tmp/hostsuntuk menambahkan entri yang Anda inginkan. Dan gunakan
export LD_LIBRARY_PATH=~/lib
untuk nss_filesmelihat, /tmp/hostsbukan /etc/hosts.
Alih-alih /tmp/hosts, Anda juga bisa membuatnya /dev/fd//3(di sini menggunakan dua garis miring sehingga panjangnya /dev/fd//3sama dengan /etc/hosts), dan lakukan
exec 3< ~/hosts
Misalnya yang akan memungkinkan perintah yang berbeda menggunakan hostsfile yang berbeda .
Jika nscddiinstal dan dijalankan, Anda dapat memotongnya dengan melakukan trik yang sama, tetapi kali ini untuk libc.so.6dan mengganti jalur ke soket nscd (semacamnya /var/run/nscd/socket) dengan beberapa jalur yang tidak ada.
LD_LIBRARY_PATHke menunjuk ke direktori yang dimiliki oleh pengguna berarti proses lain yang dijalankan oleh pengguna dapat menggunakan direktori itu untuk mengkooptasi proses baru yang dihasilkan dengan mengganti perpustakaan. Dan pembaruan libnss_files.somelalui manajer paket (termasuk pembaruan keamanan) tidak akan tercermin dalam versi yang ditambal. Memodifikasi LD_LIBRARY_PATHumumnya merupakan hal yang buruk untuk direkomendasikan karena alasan lain, tetapi juga tidak bijaksana karena masalah tersebut.
Ruang mount pribadi yang dibuat dengan unshareperintah dapat digunakan untuk menyediakan file pribadi / etc / hosts ke proses shell dan proses anak berikutnya dimulai dari shell itu.
# 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)dan clone(2)itu adalah bagian dari keajaiban di sini. Lihat juga namespaces(7)dan user_namespaces(7).
Salah satu solusinya adalah memiliki masing-masing pengguna secara terpisah chroot, sehingga masing-masing dapat memiliki yang terpisah /etc/hostsuntuk diri mereka sendiri.
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).
Menempatkan berikut ~/.bashrcini bekerja untuk saya di bash. Itu mengubah nama host di perintah menjadi alamat berdasarkan entri di ~/.hosts. Jika ~/.hoststidak ada atau jika nama host tidak ditemukan ~/.hosts, perintah dijalankan seperti biasa. Ini harus bekerja dengan flag asli dari fungsi-fungsi yang relevan dan tidak memiliki tempat di mana nama host ditempatkan relatif terhadap flag, misalnya ping -i 0.5 host1 -c 3, berfungsi. The ~/.hostsberkas mengambil preferensi atas lokasi lain untuk menemukan nama host, jadi jika ada nama host dupicate, alamat di ~/.hostsakan 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]}" "$@"
}
function ping {
resolve "$@"
}
function traceroute {
resolve "$@"
}
Contoh ~/.hostsdiberikan 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
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 .bashrcfile saya .
Misalnya, jika Anda menambahkan:
alias jrfbox='ssh jason@192.168.6.6'
di bagian bawah Anda ~/.bashrc( ~adalah direktori home Anda). Kemudian setelah Anda keluar dan masuk lagi, Anda bisa mengetik jrfbox, menekan Enter, dan itu akan terhubung.
man ssh_config.
~/.bashrc, cukup lakukan source ~/.bashrc.
. ~/.bashrc