¿Es posible agregar una lista de hosts que son específicos para un determinado usuario? ¿Quizás un archivo de host específico del usuario?
Este mecanismo también debe complementar las entradas en el /etc/hosts
archivo.
¿Es posible agregar una lista de hosts que son específicos para un determinado usuario? ¿Quizás un archivo de host específico del usuario?
Este mecanismo también debe complementar las entradas en el /etc/hosts
archivo.
Respuestas:
La funcionalidad que busca se implementa en glibc. Puede definir un archivo de hosts personalizado configurando la HOSTALIASES
variable de entorno. Los nombres en este archivo serán recogidos por gethostbyname
(ver documentación ).
Ejemplo (probado en Ubuntu 13.10):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Algunas limitaciones
HOSTALIASES
solo funciona para aplicaciones que usan getaddrinfo(3)
ogethostbyname(3)
HOSTALIASES
se pierde la configuración. ping es root setuid (porque necesita escuchar paquetes ICMP), por HOSTALIASES
lo que no funcionará con ping a menos que ya sea root antes de llamar a ping.nscd
y está limitado a nombres de host sin un punto.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
se puede ver algo como: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. Y técnicamente es que necesita abrir un socket sin procesar en lugar de ICMP (pero supongo que podría argumentar que es solo semántica).
Al lado de los LD_PRELOAD
trucos. Una alternativa simple que puede funcionar en algunos sistemas sería editar binariamente una copia de la biblioteca del sistema que maneja la resolución del nombre de host para reemplazarla /etc/hosts
por una ruta propia.
Por ejemplo, en Linux:
Si no está utilizando nscd
, copie libnss_files.so
en alguna ubicación propia como:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(la biblioteca compartida puede estar ubicada en otro lugar, por ejemplo /lib/libnss_files.so.2
)
Ahora, edite binariamente la copia para reemplazarla /etc/hosts
por algo de la misma longitud /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Editar /tmp/hosts
para agregar la entrada que desee. Y use
export LD_LIBRARY_PATH=~/lib
para nss_files
mirar en /tmp/hosts
lugar de /etc/hosts
.
En lugar de /tmp/hosts
, también podría hacerlo /dev/fd//3
(aquí usando dos barras inclinadas para que la longitud de /dev/fd//3
sea la misma que la de /etc/hosts
), y haga
exec 3< ~/hosts
Por ejemplo, lo que permitiría que diferentes comandos usen diferentes hosts
archivos.
Si nscd
está instalado y ejecutándose, puede omitirlo haciendo el mismo truco, pero esta vez libc.so.6
y reemplazando la ruta al zócalo nscd (algo así como /var/run/nscd/socket
) con alguna ruta inexistente.
LD_LIBRARY_PATH
para apuntar a un directorio propiedad del usuario significa que cualquier otro proceso ejecutado por el usuario puede usar ese directorio para cooptar cualquier proceso nuevo generado al reemplazar las bibliotecas. Y las actualizaciones a libnss_files.so
través del administrador de paquetes (incluidas las actualizaciones de seguridad) no se reflejarán en la versión parcheada. En LD_LIBRARY_PATH
general, modificar es algo malo por otras razones, pero también es imprudente debido a esos problemas.
Los espacios de montaje privados creados con el unshare
comando se pueden usar para proporcionar un archivo privado / etc / hosts a un proceso de shell y cualquier proceso secundario posterior iniciado desde ese 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)
y clone(2)
eso es parte de la magia aquí. Ver también namespaces(7)
y user_namespaces(7)
.
Una solución es tener a cada usuario en un sitio separado chroot
, para que cada uno pueda tener un sitio separado /etc/hosts
para ellos.
Enfrenté la misma necesidad, así que probé libnss-userhosts, pero falla en aplicaciones multiproceso. Por eso he escrito libnss-homehosts . Es muy nuevo y probado solo por mí. ¡Puedes darle una oportunidad! Admite algunas opciones en /etc/host.conf, múltiples nombres de alias y resolución inversa (dirección a nombre).
Colocar lo siguiente ~/.bashrc
está funcionando para mí en bash. Convierte el nombre de host en el comando en una dirección basada en las entradas en ~/.hosts
. Si ~/.hosts
no existe o si no se puede encontrar el nombre de host ~/.hosts
, el comando se ejecuta normalmente. Esto debería funcionar con los indicadores originales de las funciones relevantes y sin importar dónde se coloque el nombre de host en relación con los indicadores, por ejemplo ping -i 0.5 host1 -c 3
, funciona. El ~/.hosts
archivo tiene preferencia sobre cualquier otra ubicación para encontrar nombres de host, por lo que si hay nombres de host duplicados, ~/.hosts
se utilizará la dirección .
$ 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 "$@"
}
Un ejemplo de ~/.hosts
se da a continuación. Sigue el mismo formato que /etc/hosts
. Los comentarios y los espacios en blanco se manejan correctamente.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
No estoy seguro de si esto podría ayudarlo, pero vine aquí buscando una manera de agregar "hosts" guardados en algún lugar que fuera fácilmente accesible solo para mi usuario.
Básicamente, necesitaba poder ingresar a ciertos cuadros en nuestra red de trabajo, que solo tiene un punto de entrada.
Lo que hice fue agregar alias a mi .bashrc
archivo.
Por ejemplo, si agregó:
alias jrfbox='ssh jason@192.168.6.6'
en la parte inferior de su ~/.bashrc
( ~
es su directorio de inicio). Luego, después de cerrar sesión y volver a iniciar sesión, puede escribir jrfbox
, presionar Entery se conectará.
man ssh_config
.
~/.bashrc
, simplemente hágalo source ~/.bashrc
.
. ~/.bashrc