Могу ли я создать файл хостов для конкретных пользователей, чтобы дополнить /etc /hosts?

Можно ли добавить список хостов, которые относятся только к определенному пользователю? Возможно, пользовательский файл хостов?

Этот механизм также должен дополнять записи в файле /etc/hosts.

156 голосов | спросил redspike 1 PMpFri, 01 Apr 2011 14:17:06 +040017Friday 2011, 14:17:06

7 ответов


105

Функциональность, которую вы ищете, реализована в 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)
  • Когда используется setuid , libc очищает среду, что означает, что параметр HOSTALIASES теряется. ping - это setuid root (потому что ему нужно прослушивать ICMP-пакеты), поэтому HOSTALIASES не будет работать с ping, если вы уже не root, прежде чем вы вызываете ping.
ответил pwuertz 10 TueEurope/Moscow2013-12-10T13:51:53+04:00Europe/Moscow12bEurope/MoscowTue, 10 Dec 2013 13:51:53 +0400 2013, 13:51:53
35

Рядом с тэгами 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 socket (что-то вроде /var/run/nscd/socket) с некоторым несуществующим путем.

ответил Stéphane Chazelas 5 WedEurope/Moscow2012-12-05T04:16:33+04:00Europe/Moscow12bEurope/MoscowWed, 05 Dec 2012 04:16:33 +0400 2012, 04:16:33
16

Частные монтажные пространства, созданные с помощью команды 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
ответил frielp 13 52015vEurope/Moscow11bEurope/MoscowFri, 13 Nov 2015 18:11:09 +0300 2015, 18:11:09
4

Одним из решений является наличие каждого пользователя в отдельном chroot, поэтому каждый из них может иметь отдельный /etc/hosts.

ответил Pletiplot 10 TueEurope/Moscow2013-12-10T14:32:30+04:00Europe/Moscow12bEurope/MoscowTue, 10 Dec 2013 14:32:30 +0400 2013, 14:32:30
4

Я столкнулся с такой же потребностью, поэтому я попробовал libnss-userhosts, но он не работает в многопоточных приложениях. Поэтому я написал libnss-homehosts . Это очень новый и проверенный только мной. Вы можете дать ему шанс! Он поддерживает некоторые параметры в файле /etc/host.conf, нескольких псевдонимах и обратном разрешении (адрес для имени).

ответил bandie 20 +03002016-10-20T17:36:56+03:00312016bEurope/MoscowThu, 20 Oct 2016 17:36:56 +0300 2016, 17:36:56
1

Не уверен, что это поможет вам, но я пришел сюда, чтобы найти способ добавления сохраненных «хостов» где-то, что было легко доступно только для моего пользователя.

Мне в основном нужно было иметь возможность ssh в определенных ящиках в нашей рабочей сети, у которой есть только одна точка входа.

Что я сделал, это добавить псевдонимы в мой .bashrc файл.

Например, если вы добавили:

alias jrfbox 'ssh [email protected]' 

внизу ~/.bashrc (~ - это ваш домашний каталог), после того, как вы выйдете из системы и снова войдите в систему, вы можете ввести jrfbox, нажмите Введите , и он будет подключен.

ответил Jason 18 J000000Wednesday12 2012, 08:38:22
1

Размещение в ~/.bashrc следующего содержания в bash. Он преобразует имя хоста в команду в адрес на основе записей в ~/.hosts. Если ~/.hosts не существует или имя хоста не может быть найдено в ~/.hosts, команда выполняется как обычно. Это должно работать с исходными флагами соответствующих функций и без учета того, где имя хоста размещено относительно флагов, например. ping -i 0.5 host1 -c 3, работает. Файл ~/.hosts принимает предпочтение по любому другому местоположению для поиска имен хостов, поэтому, если есть какие-либо дублированные имена хостов, будет использоваться адрес в ~/.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]}" "[email protected]"
}

function ping {
        resolve "[email protected]"
}

function traceroute {
        resolve "[email protected]"
}

Ниже приведен пример ~/.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
ответил Kyle Fernandes 4 52016vEurope/Moscow11bEurope/MoscowFri, 04 Nov 2016 13:48:00 +0300 2016, 13:48:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132