Est-il possible d'ajouter une liste d'hôtes qui ne sont spécifiques qu'à un certain utilisateur? Peut-être un fichier d'hôtes spécifique à l'utilisateur?
Ce mécanisme devrait également compléter les entrées du /etc/hosts
fichier.
La fonctionnalité que vous recherchez est implémentée dans la glibc. Vous pouvez définir un fichier d'hôtes personnalisé en définissant la variable d'environnement HOSTALIASES
. Les noms dans ce fichier seront récupérés par gethostbyname
(voir documentation ).
Exemple (testé sur Ubuntu 13.10):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Quelques limitations:
HOSTALIASES
ne fonctionne que pour les applications utilisant getaddrinfo(3)
ou gethostbyname(3)
HOSTALIASES
est perdu. ping est setuid root ou reçoit la capacité net_raw
lors de l'exécution (car il doit écouter les paquets ICMP), donc HOSTALIASES
ne fonctionnera pas avec ping
sauf si vous êtes déjà root avant d'appeler ping
.À côté de la LD_PRELOAD
des trucs. Une alternative simple qui peut fonctionner sur quelques systèmes serait de modifier en binaire une copie de la bibliothèque système qui gère la résolution du nom d'hôte pour remplacer /etc/hosts
avec votre propre chemin.
Par exemple, sous Linux:
Si vous n'utilisez pas nscd
, copiez libnss_files.so
à un emplacement de votre choix comme:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(la bibliothèque partagée peut être située ailleurs, par exemple /lib/libnss_files.so.2
)
Maintenant, éditez la copie en binaire pour remplacer /etc/hosts
à quelque chose de la même longueur comme /tmp/hosts
.
Perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Éditer /tmp/hosts
pour ajouter l'entrée souhaitée. Et utilise
export LD_LIBRARY_PATH=~/lib
pour nss_files
à regarder dans /tmp/hosts
au lieu de /etc/hosts
.
Au lieu de /tmp/hosts
, vous pouvez également le faire /dev/fd//3
(ici en utilisant deux barres obliques pour que la longueur de /dev/fd//3
est le même que celui de /etc/hosts
), et fait
exec 3< ~/hosts
Par exemple, qui permettrait à différentes commandes d'utiliser différents fichiers hosts
.
Si nscd
est installé et fonctionne, vous pouvez le contourner en faisant la même astuce, mais cette fois pour libc.so.6
et remplacez le chemin d'accès au socket nscd (quelque chose comme /var/run/nscd/socket
) avec un chemin inexistant.
Les espaces de montage privés créés avec la commande unshare
peuvent être utilisés pour fournir un fichier privé/etc/hosts à un processus Shell et à tout processus enfant suivant démarré à partir de ce 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
J'ai fait face au même besoin, j'ai donc essayé libnss-userhosts, mais il échoue dans les applications multithread. J'ai donc écrit libnss-homehosts . C'est très nouveau et testé uniquement par moi. Vous pouvez lui donner une chance! Il prend en charge certaines options dans /etc/Host.conf, plusieurs noms d'alias et la résolution inverse (adresse à nommer).
Une solution consiste à avoir chaque utilisateur dans un chroot
distinct, afin qu'ils puissent chacun avoir un /etc/hosts
Distinct pour eux-mêmes.
Placement des éléments suivants dans ~/.bashrc
travaille pour moi en bash. Il convertit le nom d'hôte de la commande en une adresse basée sur les entrées dans ~/.hosts
. Si ~/.hosts
n'existe pas ou si le nom d'hôte est introuvable dans ~/.hosts
, la commande s'exécute normalement. Cela devrait fonctionner avec les drapeaux d'origine des fonctions pertinentes et indépendamment de l'endroit où le nom d'hôte est placé par rapport aux drapeaux, par exemple ping -i 0.5 Host1 -c 3
, travaux. Le ~/.hosts
le fichier a la préférence sur tout autre emplacement pour trouver les noms d'hôtes, donc s'il y a des noms d'hôtes en double, l'adresse dans ~/.hosts
sera utilisé.
$ 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 exemple de ~/.hosts
est donné ci-dessous. Il suit le même format que /etc/hosts
. Les commentaires et les espaces sont traités correctement.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 Host1 # this is Host1's address
login-node.inst.ac.uk login
Je ne sais pas si cela pourrait vous aider, mais je suis venu ici à la recherche d'un moyen d'ajouter des "hôtes" enregistrés quelque part qui n'était facilement accessible qu'à mon utilisateur.
J'avais essentiellement besoin de pouvoir ssh dans certaines boîtes de notre réseau de travail, qui n'a qu'un seul point d'entrée.
J'ai ajouté des alias à mon .bashrc
fichier.
Par exemple, si vous avez ajouté:
alias jrfbox='ssh [email protected]'
au bas de votre ~/.bashrc
(~
est votre répertoire personnel). Ensuite, après vous être déconnecté et reconnecté, vous pouvez taper jrfbox
, appuyer sur Enter, et il se connectera.