Posso criar um arquivo hosts específico do usuário para complementar / etc / hosts?

165

É possível adicionar uma lista de hosts que são específicos apenas para um determinado usuário? Talvez um arquivo de hosts específico do usuário?

Esse mecanismo também deve complementar as entradas no arquivo /etc/hosts .

    
por redspike 01.04.2011 / 12:17

7 respostas

112

A funcionalidade que você está procurando é implementada na glibc. Você pode definir um arquivo de hosts personalizados definindo a variável de ambiente HOSTALIASES . Os nomes neste arquivo serão coletados por gethostbyname (consulte documentação ).

Exemplo (testado no Ubuntu 13.10):

$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null

Algumas limitações:

  • HOSTALIASES só funciona para aplicativos que usam getaddrinfo(3) ou gethostbyname(3)
  • Quando setuid é usado, a libc limpa o ambiente, o que significa que a configuração HOSTALIASES é perdida. ping é root setuid (porque ele precisa escutar pacotes ICMP), então HOSTALIASES não funcionará com ping a menos que você já esteja root antes de chamar ping.
por 10.12.2013 / 10:51
38

Além dos truques LD_PRELOAD . Uma alternativa simples que pode funcionar em alguns sistemas seria a edição binária de uma cópia da biblioteca do sistema que lida com a resolução do nome do host para substituir /etc/hosts por um caminho próprio.

Por exemplo, no Linux:

Se você não estiver usando nscd , copie libnss_files.so para algum lugar como o seu:

mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib

(a biblioteca compartilhada pode estar localizada em outro lugar, por exemplo, /lib/libnss_files.so.2 )

Agora, edite binária a cópia para substituir /etc/hosts para algo do mesmo tamanho, como /tmp/hosts .

perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2

Edite /tmp/hosts para adicionar a entrada desejada. E use

export LD_LIBRARY_PATH=~/lib

para nss_files procurar em /tmp/hosts em vez de /etc/hosts .

Em vez de /tmp/hosts , você também pode usar /dev/fd//3 (usando duas barras para que o comprimento de /dev/fd//3 seja igual ao de /etc/hosts ) e faça

exec 3< ~/hosts

Por exemplo, o que permitiria que comandos diferentes usassem arquivos hosts diferentes.

Se nscd estiver instalado e em execução, você pode ignorá-lo fazendo o mesmo truque, mas desta vez para libc.so.6 e substituir o caminho para o soquete nscd (algo como /var/run/nscd/socket ) com algum caminho inexistente. / p>     

por 05.12.2012 / 01:16
19

As montagens particulares criadas com o comando unshare podem ser usadas para fornecer um arquivo privado / etc / hosts para um processo shell e qualquer processo filho subseqüente iniciado a partir desse 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
    
por 13.11.2015 / 16:11
5

Uma solução é ter cada usuário em um chroot separado, para que cada um possa ter um /etc/hosts separado para eles mesmos.

    
por 10.12.2013 / 11:32
4

Eu enfrentei a mesma necessidade, então tentei o libnss-userhosts, mas ele falha em aplicativos multiencadeados. Portanto, eu escrevi libnss-homehosts . É muito novo e testado apenas por mim. Você pode dar uma chance para isso! Ele suporta algumas opções em /etc/host.conf, vários nomes de alias e resolução reversa (endereço para nome).

    
por 20.10.2016 / 16:36
1

Não tenho certeza se isso ajudaria você, mas eu vim até aqui procurando uma maneira de adicionar "hosts" salvos em algum lugar que fosse facilmente acessível somente a meu usuário.

Eu basicamente precisava ser capaz de usar ssh em certas caixas na nossa rede de trabalho, que tem apenas um ponto de entrada.

O que eu fiz foi adicionar aliases ao meu arquivo .bashrc .

Por exemplo, se você adicionou:

alias jrfbox 'ssh [email protected]' 

na parte inferior do ~/.bashrc ( ~ é o seu diretório inicial), depois de efetuar logout e login novamente, você pode digitar jrfbox , teclar Enter e ele será conectado .

    
por 18.07.2012 / 06:38
1

Colocar o seguinte em ~/.bashrc está funcionando para mim no bash. Ele converte o nome do host no comando em um endereço baseado nas entradas em ~/.hosts . Se ~/.hosts não existir ou se o nome do host não puder ser encontrado em ~/.hosts , o comando será executado normalmente. Isso deve funcionar com os sinalizadores originais das funções relevantes e não importa onde o nome do host é colocado em relação aos sinalizadores, por exemplo, ping -i 0.5 host1 -c 3 , funciona. O arquivo ~/.hosts tem preferência sobre qualquer outro local para encontrar nomes de host, portanto, se houver qualquer nome de host de dupictos, o endereço em ~/.hosts será usado.

$ 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*.*$;;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 "$@"
}

Um exemplo de ~/.hosts é dado abaixo. Ele segue o mesmo formato que /etc/hosts . Comentários e espaços em branco são tratados corretamente.

$ cat ~/.hosts 
# addresses and hostnames
stackexchange.com se

192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
    
por 04.11.2016 / 11:48