¿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/hostsarchivo.
¿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/hostsarchivo.
Respuestas:
La funcionalidad que busca se implementa en glibc. Puede definir un archivo de hosts personalizado configurando la HOSTALIASESvariable 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
HOSTALIASESsolo funciona para aplicaciones que usan getaddrinfo(3)ogethostbyname(3)HOSTALIASESse pierde la configuración. ping es root setuid (porque necesita escuchar paquetes ICMP), por HOSTALIASESlo que no funcionará con ping a menos que ya sea root antes de llamar a ping.nscdy está limitado a nombres de host sin un punto.
127.0.0.1 somedomain.com)
getcap /usr/sbin/pingse 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_PRELOADtrucos. 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/hostspor una ruta propia.
Por ejemplo, en Linux:
Si no está utilizando nscd, copie libnss_files.soen 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/hostspor algo de la misma longitud /tmp/hosts.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Editar /tmp/hostspara agregar la entrada que desee. Y use
export LD_LIBRARY_PATH=~/lib
para nss_filesmirar en /tmp/hostslugar 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//3sea la misma que la de /etc/hosts), y haga
exec 3< ~/hosts
Por ejemplo, lo que permitiría que diferentes comandos usen diferentes hostsarchivos.
Si nscdestá instalado y ejecutándose, puede omitirlo haciendo el mismo truco, pero esta vez libc.so.6y reemplazando la ruta al zócalo nscd (algo así como /var/run/nscd/socket) con alguna ruta inexistente.
LD_LIBRARY_PATHpara 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.sotravés del administrador de paquetes (incluidas las actualizaciones de seguridad) no se reflejarán en la versión parcheada. En LD_LIBRARY_PATHgeneral, modificar es algo malo por otras razones, pero también es imprudente debido a esos problemas.
Los espacios de montaje privados creados con el unsharecomando 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/hostspara 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 ~/.bashrcestá funcionando para mí en bash. Convierte el nombre de host en el comando en una dirección basada en las entradas en ~/.hosts. Si ~/.hostsno 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 ~/.hostsarchivo tiene preferencia sobre cualquier otra ubicación para encontrar nombres de host, por lo que si hay nombres de host duplicados, ~/.hostsse 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 ~/.hostsse 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 .bashrcarchivo.
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