web-dev-qa-db-fra.com

Puis-je créer un fichier d'hôtes spécifique à l'utilisateur pour compléter / etc / hosts?

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.

205
redspike

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)
  • Pour setuid / setgid / setcap , libc nettoie l'environnement, ce qui signifie que le paramètre 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.
141
pwuertz

À 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.

44
Stéphane Chazelas

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
28
frielp

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).

6
bandie

Une solution consiste à avoir chaque utilisateur dans un chroot distinct, afin qu'ils puissent chacun avoir un /etc/hosts Distinct pour eux-mêmes.

6
Pletiplot

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
4
Kyle Fernandes

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.

2
Jason