Я могу создать определенный для пользователя файл hosts к дополнению/etc/hosts?

Это - попытка выйти из обратной косой черты с помощью расширения параметра с заменой шаблона.

$ set -- \\foo \\bar
$ echo $1
\foo
$ echo ${1/\\/\\\\}
\\foo
$ echo "This is \foo to me"
This is \foo to me
$ echo "This is \foo to me" | sed s/${1/\\/\\\\}/${2/\\/\\\\}/
This is \bar to me
$ 
196
01.04.2011, 23:29
7 ответов

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

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

То, что я сделал, было, добавляют псевдонимы к моему .bashrc файл.

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

alias jrfbox='ssh jason@192.168.6.6' 

у основания Вашего ~/.bashrc (~ Ваш корневой каталог). Затем после того, как Вы выходите из системы и входите в систему снова, можно ввести jrfbox, хит Входит, и он соединится.

2
27.01.2020, 19:28
  • 1
    Если Вы интересны конкретно в случае SSH, необходимо видеть man ssh_config. большое спасибо –  Nick 06.05.2013, 21:08
  • 2
    Вы не должны выходить из системы и въезжать задним ходом снова для перезагрузки ~/.bashrc, просто сделайте source ~/.bashrc. –  user991710 02.03.2017, 10:51

Около 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
27.01.2020, 19:28
  • 1
    +1 для смелости,-1 для значения шока –  fche 27.09.2013, 15:37
  • 2
    +1 для двоичного исправления,-1 для последствий –  Parthian Shot 26.06.2015, 23:28
  • 3
    @ParthianShot, что последствия безопасности? –  Stéphane Chazelas 27.06.2015, 14:05
  • 4
    @StéphaneChazelas LD_LIBRARY_PATH указать на каталог, принадлежавший пользователю, означает, что любой другой процесс, выполненный пользователем, может использовать тот каталог для поглощения любых новых процессов, порожденных путем замены библиотек. И обновления libnss_files.so через диспетчер пакетов (включая обновления системы защиты) не будет отражен в исправленной версии. Изменение LD_LIBRARY_PATH обычно плохая вещь рекомендовать по другим причинам, но это также неблагоразумно из-за тех проблем. –  Parthian Shot 28.06.2015, 06:26
  • 5
    @ParthianShot, Ваша точка о пропавших без вести обновлений является справедливым замечанием. Однако для Вашей другой точки, если бы программное обеспечение жулика работает на Ваше имя, это имеющий доступ для записи к области в $LD_LIBRARY_PATH было бы наименьшее количество Ваших забот, поскольку это уже получило доступ для записи к намного худшим и более надежным областям как Ваш .bash*, crontab, .forward, и все конфигурационные файлы всем программным обеспечением, которое Вы используете (где это может, например, установить LD_ {ПРЕДВАРИТЕЛЬНАЯ НАГРУЗКА, LIBRARY_PATH}, но обычно делало бы намного хуже) –  Stéphane Chazelas 28.06.2015, 10:09

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

6
27.01.2020, 19:28
  • 1
    Это могло быть ответом, но столь же установленный с небольшим объяснением он больше подходит как комментарий –  Anthon 10.12.2013, 12:49
  • 2
    безопасности Хорошо... да, это выполнимо. Хотя chrooting является довольно мощным решением для такого рода вещи. И приносит с ним его собственный набор проблем. –  Parthian Shot 26.06.2015, 23:31

Функциональность, которую Вы ищете, реализована в 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)
  • Когда setuid используется, libc санирует среду, что означает что HOSTALIASES установка потеряна. ping является корнем setuid (потому что он должен прислушаться к пакетам ICMP), таким образом, HOSTALIASES не будет работать с ping, если Вы не являетесь уже корневыми перед вызовом ping.
136
27.01.2020, 19:28
  • 1
    Обратите внимание, что это не работает, если Вы используете nscd и ограничен именами хостов без точки. –  Stéphane Chazelas 29.05.2014, 15:45
  • 2
    Это, кажется, не работает над CentOS 6 –  kbolino 01.12.2015, 20:51
  • 3
    Поздно стороне, но это - инверсия того, что желаемо, не так ли? Я думаю, что OP ищет аналогичное решение добавления разрешающих хост записей в/etc/hosts, но тот, который может быть сделан в пространстве пользователя без наращиваемых полномочий. (т.е. 127.0.0.1 somedomain.com) –  Nuri Hodges 10.11.2016, 20:53

Частные пространства монтирования, созданные с помощью команды 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
25
27.01.2020, 19:28

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

6
27.01.2020, 19:28

Размещение следующего кода в ~ / .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]}" "$@"
}

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
4
27.01.2020, 19:28

Теги

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