Можно ли добавить список хостов, которые относятся только к определенному пользователю? Возможно, пользовательский файл hosts?
Этот механизм также должен дополнять записи в /etc/hosts
файле.
Можно ли добавить список хостов, которые относятся только к определенному пользователю? Возможно, пользовательский файл hosts?
Этот механизм также должен дополнять записи в /etc/hosts
файле.
Ответы:
Функциональность, которую вы ищете, реализована в glibc. Вы можете определить собственный файл hosts, установив 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 - это setuid root (потому что он должен прослушивать 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, но это не помогло многопоточным приложениям. Поэтому я написал libnss-homehosts . Это очень новое и проверено только мной. Вы можете дать шанс для этого! Он поддерживает некоторые параметры в /etc/host.conf, несколько псевдонимов и обратное разрешение (адрес к имени).
Размещение следующего в ~/.bashrc
работает для меня в Bash. Он преобразует имя хоста в команде в адрес на основе записей в ~/.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