it-swarm-ru.tech

Могу ли я создать специальный файл hosts для дополнения / etc / hosts?

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

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

205
redspike

Функциональность, которую вы ищете, реализована в 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 / setgid / setcap приложений, libc очищает среду, что означает, что настройка HOSTALIASES потеряна. ping является корнем setuid или ему предоставляется возможность _net_raw_ при выполнении (поскольку он должен прослушивать пакеты ICMP), поэтому HOSTALIASES не будет работать с ping, если вы уже не являетесь пользователем root, прежде чем вызывать ping.
141
pwuertz

За 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) с каким-то несуществующим путем.

44
Stéphane Chazelas

Личные монтируемые пространства, созданные с помощью команды unshare, можно использовать для предоставления частного файла/etc/hosts процессу Shell и любым последующим дочерним процессам, запущенным из этой оболочки.

# 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

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

6
bandie

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

6
Pletiplot

Размещение следующего в ~/.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
4
Kyle Fernandes

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

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

Я добавил псевдонимы к своему .bashrc файл.

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

alias jrfbox='ssh [email protected]' 

в нижней части вашего ~/.bashrc (~ ваш домашний каталог). Затем, после выхода и повторного входа, вы можете набрать jrfbox, нажать Enterи он подключится.

2
Jason