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.
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.
Jawaban:
Fungsionalitas yang Anda cari diimplementasikan dalam glibc. Anda dapat menentukan file host kustom dengan mengatur HOSTALIASES
variabel 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:
HOSTALIASES
hanya berfungsi untuk aplikasi yang menggunakan getaddrinfo(3)
ataugethostbyname(3)
HOSTALIASES
pengaturannya hilang. ping adalah setuid root (karena itu perlu mendengarkan paket ICMP), jadi HOSTALIASES
tidak akan berfungsi dengan ping kecuali Anda sudah melakukan root sebelum menelepon ping.nscd
dan terbatas pada nama host tanpa titik.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
Anda 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_PRELOAD
trik. Alternatif sederhana yang dapat bekerja pada beberapa sistem adalah dengan mengedit biner pustaka sistem yang menangani resolusi nama host untuk diganti /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 dapat ditemukan di tempat lain, misalnya /lib/libnss_files.so.2
)
Sekarang, edit biner salinan untuk menggantikan /etc/hosts
di sana untuk sesuatu yang sama panjangnya /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
melihat, /tmp/hosts
bukan /etc/hosts
.
Alih-alih /tmp/hosts
, Anda juga bisa membuatnya /dev/fd//3
(di sini menggunakan dua garis miring sehingga panjangnya /dev/fd//3
sama dengan /etc/hosts
), dan lakukan
exec 3< ~/hosts
Misalnya yang akan memungkinkan perintah yang berbeda menggunakan hosts
file yang berbeda .
Jika nscd
diinstal dan dijalankan, Anda dapat memotongnya dengan melakukan trik yang sama, tetapi kali ini untuk libc.so.6
dan mengganti jalur ke soket nscd (semacamnya /var/run/nscd/socket
) dengan beberapa jalur yang tidak ada.
LD_LIBRARY_PATH
ke 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.so
melalui manajer paket (termasuk pembaruan keamanan) tidak akan tercermin dalam versi yang ditambal. Memodifikasi LD_LIBRARY_PATH
umumnya merupakan hal yang buruk untuk direkomendasikan karena alasan lain, tetapi juga tidak bijaksana karena masalah tersebut.
Ruang mount pribadi yang dibuat dengan unshare
perintah 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/hosts
untuk 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 ~/.bashrc
ini bekerja untuk saya di bash. Itu mengubah nama host di perintah menjadi alamat berdasarkan entri di ~/.hosts
. Jika ~/.hosts
tidak 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 ~/.hosts
berkas mengambil preferensi atas lokasi lain untuk menemukan nama host, jadi jika ada nama host dupicate, 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]}" "$@"
}
function ping {
resolve "$@"
}
function traceroute {
resolve "$@"
}
Contoh ~/.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
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 .bashrc
file 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