Est-il possible d'ajouter une liste d'hôtes uniquement spécifiques à un utilisateur donné? 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.
Est-il possible d'ajouter une liste d'hôtes uniquement spécifiques à un utilisateur donné? 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.
Réponses:
La fonctionnalité que vous recherchez est implémentée dans glibc. Vous pouvez définir un fichier d'hôtes personnalisé en définissant la HOSTALIASES
variable d'environnement. 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)
ougethostbyname(3)
HOSTALIASES
paramètre est perdu. ping est setuid root (car il doit écouter les paquets ICMP), il HOSTALIASES
ne fonctionnera donc pas avec ping sauf si vous êtes déjà root avant d'appeler ping.nscd
et est limité aux noms d’hôte sans point.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
vous pouvez voir quelque chose comme: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. Et techniquement, il faut ouvrir une socket raw plutôt que ICMP (mais je suppose que vous pourriez soutenir que ce n’est que de la sémantique).
À côté des LD_PRELOAD
astuces. Une alternative simple pouvant fonctionner sur quelques systèmes serait d'éditer, en binaire, une copie de la bibliothèque système qui gère la résolution du nom d'hôte afin de la remplacer /etc/hosts
par votre propre chemin.
Par exemple, sous Linux:
Si vous ne l'utilisez pas nscd
, copiez-le libnss_files.so
dans un emplacement de votre choix, par exemple:
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 binaire la copie pour la remplacer /etc/hosts
par quelque chose de la même longueur /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Modifier /tmp/hosts
pour ajouter l'entrée souhaitée. Et utilise
export LD_LIBRARY_PATH=~/lib
pour nss_files
regarder au /tmp/hosts
lieu de /etc/hosts
.
Au lieu de /tmp/hosts
, vous pouvez aussi le faire /dev/fd//3
(ici, en utilisant deux barres obliques pour que la longueur de /dev/fd//3
soit la même que celle de /etc/hosts
), et ne
exec 3< ~/hosts
Par exemple, cela permettrait à différentes commandes d'utiliser différents hosts
fichiers.
Si nscd
est installé et en cours d'exécution, vous pouvez le contourner en procédant de la même manière, mais cette fois pour libc.so.6
et remplacez le chemin d'accès à la socket nscd (quelque chose comme /var/run/nscd/socket
) par un chemin inexistant.
LD_LIBRARY_PATH
de pointage vers un répertoire appartenant à l'utilisateur signifie que tout autre processus exécuté par l'utilisateur peut utiliser ce répertoire pour coopter tout nouveau processus généré par le remplacement de bibliothèques. Et les mises à jour libnss_files.so
via le gestionnaire de paquets (y compris les mises à jour de sécurité) ne seront pas reflétées dans la version corrigée. La modification LD_LIBRARY_PATH
est généralement une mauvaise chose à recommander pour d'autres raisons, mais elle est également déconseillée à cause de ces problèmes.
Les espaces de montage privés créés avec la unshare
commande peuvent être utilisés pour fournir un fichier privé / etc / hosts à un processus shell et à tous les processus enfants ultérieurs démarrés à 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
unshare(2)
et clone(2)
cela fait partie de la magie ici. Voir aussi namespaces(7)
et user_namespaces(7)
.
Une solution consiste à placer chaque utilisateur de manière distincte chroot
, de manière à ce que chacun puisse avoir sa propre /etc/hosts
identité.
J'ai rencontré le même besoin, j'ai donc essayé libnss-userhosts, mais cela échouait dans les applications multithread. Par conséquent, j'ai écrit libnss-homehosts . C'est très nouveau et testé seulement par moi. Vous pouvez donner une chance pour cela! Il prend en charge certaines options de /etc/host.conf, plusieurs noms d’alias et la résolution inverse (adresse à nom).
Placer les éléments suivants dans ~/.bashrc
fonctionne pour moi en bash. Il convertit le nom d'hôte de la commande en une adresse basée sur les entrées de ~/.hosts
. S'il ~/.hosts
n'existe pas ou si le nom d'hôte est introuvable ~/.hosts
, la commande s'exécute normalement. Cela devrait fonctionner avec les indicateurs d'origine des fonctions pertinentes et sans indiquer l'emplacement où le nom d'hôte est placé par rapport aux indicateurs, par exemple ping -i 0.5 host1 -c 3
, travaux. Le ~/.hosts
fichier a la préférence sur tout autre emplacement pour la recherche de noms d’hôte. Ainsi, s’il existe des noms d’hôte doubles, l’adresse ~/.hosts
sera utilisée.
$ 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 géré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 suis pas sûr que cela puisse vous aider, mais je suis venu ici pour trouver un moyen d'ajouter des "hôtes" enregistrés dans un endroit facilement accessible à l'utilisateur.
En gros, je devais être capable de ssh dans certaines boîtes de notre réseau de travail, qui n’avait qu’un seul point d’entrée.
Ce que j'ai fait a été d'ajouter des alias à mon .bashrc
fichier.
Par exemple, si vous avez ajouté:
alias jrfbox='ssh jason@192.168.6.6'
au bas de votre ~/.bashrc
( ~
est votre répertoire personnel). Ensuite, après vous être déconnecté et reconnecté, vous pouvez taper jrfbox
, cliquer Enteret il se connectera.
man ssh_config
.
~/.bashrc
, il vous suffit de le faire source ~/.bashrc
.
. ~/.bashrc