Чи можна додати список хостів, специфічний лише для певного користувача? Можливо певний користувачем файл хостів?
Цей механізм також повинен доповнювати записи у /etc/hosts
файлі.
Чи можна додати список хостів, специфічний лише для певного користувача? Можливо певний користувачем файл хостів?
Цей механізм також повинен доповнювати записи у /etc/hosts
файлі.
Відповіді:
Функціонал, який ви шукаєте, реалізований у glibc. Ви можете визначити спеціальний файл хостів, встановивши HOSTALIASES
змінну середовища. Імена цього файлу будуть обрані gethostbyname
(див. Документацію ).
Приклад (тестований на Ubuntu 13.10):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Деякі обмеження:
HOSTALIASES
працює лише для програм, що використовують getaddrinfo(3)
абоgethostbyname(3)
HOSTALIASES
налаштування втрачено. ping - це встановлений корінь (тому що йому потрібно слухати пакети ICMP), тому HOSTALIASES
він не працюватиме з ping, якщо ви вже не root перед тим, як викликати ping.nscd
і обмежений іменами хостів без крапки.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
ви можете побачити що - щось на кшталт: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. А технічно це те, що для цього потрібно відкрити необроблений сокет, а не ICMP (але, мабуть, ви можете стверджувати, що це просто семантика).
Поруч з LD_PRELOAD
хитрощами. Найпростішою альтернативою, яка може працювати в декількох системах, буде бінарне редагування копії системної бібліотеки, яка обробляє роздільну здатність імені хоста, замінити /etc/hosts
на власний шлях.
Наприклад, в Linux:
Якщо ви не використовуєте nscd
, скопіюйте libnss_files.so
в якесь власне місцеположення, як-от:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(спільна бібліотека може знаходитися в іншому місці, наприклад /lib/libnss_files.so.2
)
Тепер, бінарне редагування копії, щоб замінити /etc/hosts
там щось на зразок такої довжини, як /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Редагувати, /tmp/hosts
щоб додати потрібну запис. І використовувати
export LD_LIBRARY_PATH=~/lib
для того, nss_files
щоб шукати /tmp/hosts
замість /etc/hosts
.
Замість цього /tmp/hosts
, ви також можете зробити це /dev/fd//3
(тут, використовуючи два косої риски, щоб довжина /dev/fd//3
була такою ж, як у /etc/hosts
), і зробити
exec 3< ~/hosts
Наприклад, яка дозволила б різним командам використовувати різні hosts
файли.
Якщо nscd
він встановлений і запущений, його можна обійти, виконавши той самий трюк, але на цей раз libc.so.6
і замініть шлях до сокета nscd (щось подібне /var/run/nscd/socket
) на якийсь неіснуючий шлях.
LD_LIBRARY_PATH
вказівки на каталог, що належить користувачеві, означає, що будь-який інший процес, керований користувачем, може використовувати цей каталог для кооптування будь-яких нових процесів, породжених заміною бібліотек. І оновлення libnss_files.so
через менеджер пакунків (включаючи оновлення безпеки) не відображатимуться у виправленій версії. Зміна, LD_LIBRARY_PATH
як правило, погано рекомендувати з інших причин, але це також нерозумно через ці проблеми.
Приватні простори монтажу, створені за допомогою unshare
команди, можуть використовуватися для надання приватного файлу / etc / hosts процесу оболонки та будь-яких подальших дочірніх процесів, запущених з цієї оболонки.
# 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)
і clone(2)
це є частиною магії. Дивіться також namespaces(7)
і user_namespaces(7)
.
Одне рішення - мати кожного користувача окремо chroot
, тому кожен може мати окремий /etc/hosts
для себе.
Я зіткнувся з такою ж потребою, тому спробував libnss-userhosts, але це не вдається при багатопотокових програмах. Тому я написав лібни-домовики . Це дуже нове і перевірене лише мною. Ви можете дати шанс на це! Він підтримує деякі параметри в /etc/host.conf, декілька імен псевдонімів та зворотного дозволу (адреса до імені).
Розміщення наступного в ~/.bashrc
мені працює в баш. Він перетворює ім'я хоста в команді в адресу на основі записів в ~/.hosts
. Якщо ~/.hosts
його немає або якщо ім'я хоста неможливо знайти ~/.hosts
, команда виконується як звичайне. Це повинно працювати з оригінальними прапорами відповідних функцій і незалежно від того, де ім'я хоста розміщено відносно прапорів, наприклад ping -i 0.5 host1 -c 3
, працює. ~/.hosts
Файл віддається перевага перед будь-яким іншим місцем для знаходження хостів, так що якщо є якісь - dupicate імен хостів, адреса в ~/.hosts
використовуватиметься.
$ 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 "$@"
}
Приклад ~/.hosts
наведено нижче. Він має той самий формат, що і /etc/hosts
. Простір коментарів і пробілів обробляється правильно.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
Не впевнений, чи допоможе це вам, але я прийшов сюди шукати спосіб додати збережені "хости" десь, які були легко доступні лише моєму користувачеві.
Мені в основному потрібно було мати змогу зайти в певні поля в нашій робочій мережі, де є лише одна точка входу.
Що я зробив, це додати псевдоніми до мого .bashrc
файлу.
Наприклад, якщо ви додали:
alias jrfbox='ssh jason@192.168.6.6'
внизу вашого домашнього каталогу ~/.bashrc
( ~
це ваш домашній каталог). Потім після входу та входу знову можна ввести jrfbox
, натиснути Enter, і він підключиться.
man ssh_config
.
~/.bashrc
, просто зробіть це source ~/.bashrc
.
. ~/.bashrc