É possível adicionar uma lista de hosts que são específicos apenas para um determinado usuário? Talvez um arquivo de hosts específicos do usuário?
Esse mecanismo também deve complementar as entradas no /etc/hosts
arquivo.
É possível adicionar uma lista de hosts que são específicos apenas para um determinado usuário? Talvez um arquivo de hosts específicos do usuário?
Esse mecanismo também deve complementar as entradas no /etc/hosts
arquivo.
Respostas:
A funcionalidade que você está procurando é implementada na glibc. Você pode definir um arquivo de hosts customizados configurando a HOSTALIASES
variável de ambiente. Os nomes neste arquivo serão selecionados por gethostbyname
(consulte a 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)
ougethostbyname(3)
HOSTALIASES
configuração é perdida. ping é root setuid (porque precisa escutar pacotes ICMP), portanto HOSTALIASES
, não funcionará com ping, a menos que você já seja root antes de chamá-lo.nscd
e está limitado a nomes de host sem um ponto.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
que você pode ver algo como: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. E tecnicamente é que ele precisa abrir um soquete bruto em vez do ICMP (mas suponho que você possa argumentar que isso é apenas semântica).
Ao lado dos LD_PRELOAD
truques. 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 local como:
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 a cópia binária para substituir /etc/hosts
nela com algo do mesmo tamanho /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
vez de /etc/hosts
.
Em vez de /tmp/hosts
, você também pode fazê-lo /dev/fd//3
(aqui usando duas barras para que o comprimento de /dev/fd//3
seja o mesmo de /etc/hosts
) e
exec 3< ~/hosts
Por exemplo, o que permitiria que comandos diferentes usassem hosts
arquivos diferentes .
Se nscd
estiver instalado e em execução, você pode ignorá-lo fazendo o mesmo truque, mas desta vez libc.so.6
e substituindo o caminho para o soquete nscd (algo como /var/run/nscd/socket
) por algum caminho inexistente.
LD_LIBRARY_PATH
para apontar para um diretório de propriedade do usuário significa que qualquer outro processo executado pelo usuário pode usar esse diretório para cooptar quaisquer novos processos gerados pela substituição de bibliotecas. E as atualizações libnss_files.so
através do gerenciador de pacotes (incluindo atualizações de segurança) não serão refletidas na versão corrigida. Modificar LD_LIBRARY_PATH
geralmente é uma coisa ruim a ser recomendada por outros motivos, mas também é imprudente por causa desses problemas.
Espaços de montagem privados criados com o unshare
comando podem ser usados para fornecer um arquivo / etc / hosts privado a um processo de shell e quaisquer processos filhos subsequentes iniciados 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
unshare(2)
e clone(2)
isso faz parte da mágica aqui. Veja também namespaces(7)
e user_namespaces(7)
.
Uma solução é ter cada usuário em separado chroot
, para que cada um possa ter um separado /etc/hosts
para si.
Eu enfrentei a mesma necessidade, então tentei o libnss-userhosts, mas ele falha em aplicativos multithread. Portanto, eu escrevi libnss-homehosts . É muito novo e testado apenas por mim. Você pode dar uma chance para isso! Ele suporta algumas opções no /etc/host.conf, vários nomes de alias e resolução reversa (endereço para nome).
Colocar o seguinte em ~/.bashrc
está funcionando para mim no bash. Ele converte o nome do host no comando em um endereço com base nas entradas em ~/.hosts
. Se ~/.hosts
não existir ou se o nome do host não puder ser encontrado ~/.hosts
, o comando será executado normalmente. Isso deve funcionar com os sinalizadores originais das funções relevantes e independentemente de onde o nome do host é colocado em relação aos sinalizadores, por exemplo ping -i 0.5 host1 -c 3
, funciona. O ~/.hosts
arquivo tem preferência sobre qualquer outro local para localizar nomes de host; portanto, se houver nomes de host duplos, o endereço ~/.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*.*$;\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 "$@"
}
Um exemplo de ~/.hosts
é dado abaixo. Segue o mesmo formato que /etc/hosts
. Comentários e espaço 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
Não tenho certeza se isso iria ajudá-lo, mas eu vim aqui procurando uma maneira de adicionar "hosts" salvos em algum lugar que fosse facilmente acessível apenas ao meu usuário.
Basicamente, eu precisava ser capaz de ssh em determinadas caixas em nossa rede de trabalho, que possui apenas um ponto de entrada.
O que fiz foi adicionar aliases ao meu .bashrc
arquivo.
Por exemplo, se você adicionou:
alias jrfbox='ssh jason@192.168.6.6'
na parte inferior do seu ~/.bashrc
( ~
é o seu diretório inicial). Depois de sair e fazer login novamente, você pode digitar jrfbox
, clicar Entere ele se conectará.
man ssh_config
.
~/.bashrc
, basta fazer source ~/.bashrc
.
. ~/.bashrc