sur ma machine, j'ai un /etc/hosts avec plein d'alias perso dedans (en
bombinant avec les hosts ssh, c'est merveilleux d'éfficacité et de
mémoire). c'est une pratique que je m'interdis sur des machines qui sont
co-gérées et cette discipline est pénible.
sauf que cette semaine, je trouve dans GETHOSTBYNAME(3):
in_addr equivalent into the h_addr_list[0] field of the returned
hostent structure. If name doesn't end in a dot and the
environment variable HOSTALIASES is set, the alias file pointed to
by HOSTALIASES will first be searched for name (see hostname(7) for
the file format). The current domain and its parents are searched
unless name ends in a dot.
génial! tentative ....
$ export HOSTALIASES=~/.hosts
$ echo 127.0.0.1 wow> $HOSTALIASES
$ ping wow
ping: wow: Aucune adresse associée avec le nom de l'hôte
pas mieux avec `getent ahosts` ...
j'ai vu dans GETENT(1) qu'il y a un GETHOSTBYNAME(3) qui utilise aussi
$HOSTALIASES. du coup je me suis dis que files arrivait trop tard mais:
$ grep -H '^hosts' /etc/nsswitch.conf
/etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
didier.gaumet
avertissement habituel: le réseau et moi ça fait deux... mais la page man de gethostbyname(3) indique que la fonction, bien que touj ours disponible, a été remplacée par getnameinfo(3) dont on conseille l'usage. Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
avertissement habituel: le réseau et moi ça fait deux...
mais la page man de gethostbyname(3) indique que la fonction, bien que touj ours disponible, a été remplacée par getnameinfo(3) dont on conseille l'usage.
Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
avertissement habituel: le réseau et moi ça fait deux... mais la page man de gethostbyname(3) indique que la fonction, bien que touj ours disponible, a été remplacée par getnameinfo(3) dont on conseille l'usage. Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
Marc Chantreux
salut Basile,
Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5) <http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html>
sauf que je disais dans mon message initial que $ grep -H '^hosts' /etc/nsswitch.conf /etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns files est appellé en premier donc ca n'est pas du à la réponse négative d'une base qui aurait priorité.
Pour ssh ou mosh, je configurerais plutôt des fichiers spécifiques (par exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et toutes ces commandes qui sous-traitent à ssh marchent bien mais qu'à l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Enfin, la libc est tellement centrale, qu'il y a plein de caches associées. Voir aussi http://www.linux-pam.org/ et rebooter la machine
je viens de faire un strace en root et on y voit bien qu'il lit le fichier (deux fois, même...). $ cd /tmp $ echo 127.0.0.1 wow > a $ export HOSTALIASES=/tmp/a $ strace ping wow |& sed '/tmp.a"/,/^close/!d' ping: wow: Aucune adresse associée avec le nom de l'hôte openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5 read(5, "1", 1) = 1 read(5, "2", 1) = 1 read(5, "7", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "1", 1) = 1 read(5, " ", 1) = 1 read(5, "w", 1) = 1 read(5, "o", 1) = 1 read(5, "w", 1) = 1 read(5, "n", 1) = 1 read(5, "", 1) = 0 close(5) = 0 openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5 read(5, "1", 1) = 1 read(5, "2", 1) = 1 read(5, "7", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "1", 1) = 1 read(5, " ", 1) = 1 read(5, "w", 1) = 1 read(5, "o", 1) = 1 read(5, "w", 1) = 1 read(5, "n", 1) = 1 read(5, "", 1) = 0 close(5) = 0 donc je pense pas que ce soit une question de cache mais je rebooterais la machine à l'occas. cordialement, marc
salut Basile,
Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5)
<http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html>
sauf que je disais dans mon message initial que
$ grep -H '^hosts' /etc/nsswitch.conf
/etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns
files est appellé en premier donc ca n'est pas du à la réponse négative
d'une base qui aurait priorité.
Pour ssh ou mosh, je configurerais plutôt des fichiers spécifiques (par
exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et
toutes ces commandes qui sous-traitent à ssh marchent bien mais qu'à
l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Enfin, la libc est tellement centrale, qu'il y a plein de caches associées.
Voir aussi http://www.linux-pam.org/ et rebooter la machine
je viens de faire un strace en root et on y voit bien qu'il lit le
fichier (deux fois, même...).
$ cd /tmp
$ echo 127.0.0.1 wow > a
$ export HOSTALIASES=/tmp/a
$ strace ping wow |& sed '/tmp.a"/,/^close/!d'
Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5) <http://man7.org/linux/man-pages/man5/nsswitch.conf.5.html>
sauf que je disais dans mon message initial que $ grep -H '^hosts' /etc/nsswitch.conf /etc/nsswitch.conf:hosts: files mdns4_minimal [NOTFOUND=return] dns files est appellé en premier donc ca n'est pas du à la réponse négative d'une base qui aurait priorité.
Pour ssh ou mosh, je configurerais plutôt des fichiers spécifiques (par exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et toutes ces commandes qui sous-traitent à ssh marchent bien mais qu'à l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Enfin, la libc est tellement centrale, qu'il y a plein de caches associées. Voir aussi http://www.linux-pam.org/ et rebooter la machine
je viens de faire un strace en root et on y voit bien qu'il lit le fichier (deux fois, même...). $ cd /tmp $ echo 127.0.0.1 wow > a $ export HOSTALIASES=/tmp/a $ strace ping wow |& sed '/tmp.a"/,/^close/!d' ping: wow: Aucune adresse associée avec le nom de l'hôte openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5 read(5, "1", 1) = 1 read(5, "2", 1) = 1 read(5, "7", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "1", 1) = 1 read(5, " ", 1) = 1 read(5, "w", 1) = 1 read(5, "o", 1) = 1 read(5, "w", 1) = 1 read(5, "n", 1) = 1 read(5, "", 1) = 0 close(5) = 0 openat(AT_FDCWD, "/tmp/a", O_RDONLY|O_CLOEXEC) = 5 read(5, "1", 1) = 1 read(5, "2", 1) = 1 read(5, "7", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "0", 1) = 1 read(5, ".", 1) = 1 read(5, "1", 1) = 1 read(5, " ", 1) = 1 read(5, "w", 1) = 1 read(5, "o", 1) = 1 read(5, "w", 1) = 1 read(5, "n", 1) = 1 read(5, "", 1) = 0 close(5) = 0 donc je pense pas que ce soit une question de cache mais je rebooterais la machine à l'occas. cordialement, marc
Marc Chantreux
salut Didier,
avertissement habituel: le réseau et moi ça fait deux...
ben la stack réseau de linux est un peu devenu une usine à gaze pour moi... par contre j'utilise maintenant Gnome et NetworkManager et il faut bien avouer que dans la grande majorité des cas, ca juste marche.
Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
comme je disais dans l'autre message: la base est bien consultée quand je fais ping par exemple. je vais faire un essai ce we: écrire deux petits bouts de C avec les 2 fonctions pour voir strace voit un comportement différent. cordialement, marc
salut Didier,
avertissement habituel: le réseau et moi ça fait deux...
ben la stack réseau de linux est un peu devenu une usine à gaze pour
moi... par contre j'utilise maintenant Gnome et NetworkManager et il
faut bien avouer que dans la grande majorité des cas, ca juste marche.
Je suppose qu'en interne lors de tes essais, c'est la nouvelle
fonction et pas l'ancienne qui est appelée...
comme je disais dans l'autre message: la base est bien consultée quand
je fais ping par exemple.
je vais faire un essai ce we: écrire deux petits bouts de C avec les 2
fonctions pour voir strace voit un comportement différent.
avertissement habituel: le réseau et moi ça fait deux...
ben la stack réseau de linux est un peu devenu une usine à gaze pour moi... par contre j'utilise maintenant Gnome et NetworkManager et il faut bien avouer que dans la grande majorité des cas, ca juste marche.
Je suppose qu'en interne lors de tes essais, c'est la nouvelle fonction et pas l'ancienne qui est appelée...
comme je disais dans l'autre message: la base est bien consultée quand je fais ping par exemple. je vais faire un essai ce we: écrire deux petits bouts de C avec les 2 fonctions pour voir strace voit un comportement différent. cordialement, marc
Daniel Caillibaud
Le 13/09/19 à 15h46, Marc Chantreux a écrit :
Pour ssh ou mosh, je configurerais plutôt des fichiers spécif iques (par exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et toutes ces commandes qui sous-traitent à ssh marchent bien mais qu' à l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Pour ce besoin, j'utilise mon résolveur local (unbound), avec - la liste `host ip` dans un /etc/unbound/hosts.list - un /root/bin/refresh_unbound_local_zone.sh qui génère un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne) Dans mon cas c'est pour gérer du *.lan.domain.tld (qui n'existe pas dans les dns publics), avec dans le resolv.conf un search lan.domain.tld => L'utilisateur n'a pas besoin de connaître le suffixe lan.domain.t ld, s'il veut joindre le host toto ça ira chercher dans unbound toto.lan.d omain.tld Ça donne dans ce local.conf server: # pour qu'il accepte de donner des ip privées dans les réponses private-domain: "lan.domain.tld" # notre domaine fictif statique local-zone: "lan.domain.tld." static # la liste d'après /etc/unbound/hosts.list local-data: "xx.lan.domain.tld. IN A 192.168.x.y" local-data-ptr: "192.168.x.y xx.lan.domain.tld" Je suis sûr que tu n'a pas besoin de moi pour écrire la transform ation liste => conf, mais si ça peut servir à d'autres voici mon scri pt. Dsl c'est du bash, mais zsh doit digérer ça sans pb ;-) #!/bin/bash # pour générer la liste d'après la conf c'est # sed -nre 's/.*local-data:.*"([^.]+).[^0-9]*([0-9.]+)".*/1 2/p' /etc/ unbound/unbound.conf.d/local.conf set -u SRC=/etc/unbound/hosts.list DST=/etc/unbound/unbound.conf.d/local.conf BAK=/etc/unbound/local.bak BAKO=/etc/unbound/local.ko DOM=lan.domain.tld OK=0 KO=1 confirm=yes [ "${1-}" == "-y" ] && confirm=no [ ! -f $SRC ] && echo "$SRC n'existe pas, abandon">&2 && exit $KO if [ "$confirm" == "yes" ]; then echo "Ce script va écraser la conf locale (statique) d'unbound pour $DOM (avec les $(egrep -c '^[a-z]' $SRC) hosts de $SRC)" echo "Continuer [o/N] ?" read rep [ "$rep" != "o" ] && echo "Abandon" && exit $OK fi # backup conf actuelle cp -af $DST $BAK cat <<EOF > $DST # fichier généré automatiquement d'après $0 server: # pour qu'il accepte de donner des ip privées dans les réponses private-domain: "lan.domain.tld" # notre domaine fictif statique local-zone: "lan.domain.tld." static # la liste d'après $SRC EOF awk '/^[a-z]/ { printf(" local-data: "%s.'$DOM'. IN A %s"n", $1, $2) printf(" local-data-ptr: "%s %s.'$DOM'"n", $2, $1) }' < $SRC >> $DST if unbound-checkconf then if [ "$confirm" == "yes" ]; then echo "Conf OK, recharger unbound [o/N] ?" read rep [ "$rep" != "o" ] && echo "Sortie sans rechargement, unbound UTILISE TOUJOURS l'ancienne configuration" && exit $OK fi unbound-control reload else echo "Conf KO (cf le résultat généré dans $BAKO), on remet l'ancienne" cp -af $DST $BAKO cp -af $BAK $DST fi -- Daniel À une table, le nombre 13 n'est à craindre que si il n'y a à manger pour 12. Grimod de la Reynière
Le 13/09/19 à 15h46, Marc Chantreux <mc@unistra.fr> a écrit :
> Pour ssh ou mosh, je configurerais plutôt des fichiers spécif iques (par
> exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et
toutes ces commandes qui sous-traitent à ssh marchent bien mais qu' à
l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Pour ce besoin, j'utilise mon résolveur local (unbound), avec
- la liste `host ip` dans un /etc/unbound/hosts.list
- un /root/bin/refresh_unbound_local_zone.sh qui génère
un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la
nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)
Dans mon cas c'est pour gérer du *.lan.domain.tld (qui n'existe
pas dans les dns publics), avec dans le resolv.conf un
search lan.domain.tld
=> L'utilisateur n'a pas besoin de connaître le suffixe lan.domain.t ld,
s'il veut joindre le host toto ça ira chercher dans unbound toto.lan.d omain.tld
Ça donne dans ce local.conf
server:
# pour qu'il accepte de donner des ip privées dans les réponses
private-domain: "lan.domain.tld"
# notre domaine fictif statique
local-zone: "lan.domain.tld." static
# la liste d'après /etc/unbound/hosts.list
local-data: "xx.lan.domain.tld. IN A 192.168.x.y"
local-data-ptr: "192.168.x.y xx.lan.domain.tld"
Je suis sûr que tu n'a pas besoin de moi pour écrire la transform ation
liste => conf, mais si ça peut servir à d'autres voici mon scri pt.
Dsl c'est du bash, mais zsh doit digérer ça sans pb ;-)
#!/bin/bash
# pour générer la liste d'après la conf c'est
# sed -nre 's/.*local-data:.*"([^.]+).[^0-9]*([0-9.]+)".*/1 2/p' /etc/ unbound/unbound.conf.d/local.conf
if [ "$confirm" == "yes" ]; then
echo "Ce script va écraser la conf locale (statique) d'unbound pour $DOM (avec les $(egrep -c '^[a-z]' $SRC) hosts de $SRC)"
echo "Continuer [o/N] ?"
read rep
[ "$rep" != "o" ] && echo "Abandon" && exit $OK
fi
# backup conf actuelle
cp -af $DST $BAK
cat <<EOF > $DST
# fichier généré automatiquement d'après $0
server:
# pour qu'il accepte de donner des ip privées dans les réponses
private-domain: "lan.domain.tld"
# notre domaine fictif statique
local-zone: "lan.domain.tld." static
Pour ssh ou mosh, je configurerais plutôt des fichiers spécif iques (par exemple sous ~/.ssh)
précisément: je me plante régulièrement parceque ssh, scp, rsync, git et toutes ces commandes qui sous-traitent à ssh marchent bien mais qu' à l'inverse, curl, firefox, tcptraceroute et autres ne fonctionnent pas.
Pour ce besoin, j'utilise mon résolveur local (unbound), avec - la liste `host ip` dans un /etc/unbound/hosts.list - un /root/bin/refresh_unbound_local_zone.sh qui génère un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne) Dans mon cas c'est pour gérer du *.lan.domain.tld (qui n'existe pas dans les dns publics), avec dans le resolv.conf un search lan.domain.tld => L'utilisateur n'a pas besoin de connaître le suffixe lan.domain.t ld, s'il veut joindre le host toto ça ira chercher dans unbound toto.lan.d omain.tld Ça donne dans ce local.conf server: # pour qu'il accepte de donner des ip privées dans les réponses private-domain: "lan.domain.tld" # notre domaine fictif statique local-zone: "lan.domain.tld." static # la liste d'après /etc/unbound/hosts.list local-data: "xx.lan.domain.tld. IN A 192.168.x.y" local-data-ptr: "192.168.x.y xx.lan.domain.tld" Je suis sûr que tu n'a pas besoin de moi pour écrire la transform ation liste => conf, mais si ça peut servir à d'autres voici mon scri pt. Dsl c'est du bash, mais zsh doit digérer ça sans pb ;-) #!/bin/bash # pour générer la liste d'après la conf c'est # sed -nre 's/.*local-data:.*"([^.]+).[^0-9]*([0-9.]+)".*/1 2/p' /etc/ unbound/unbound.conf.d/local.conf set -u SRC=/etc/unbound/hosts.list DST=/etc/unbound/unbound.conf.d/local.conf BAK=/etc/unbound/local.bak BAKO=/etc/unbound/local.ko DOM=lan.domain.tld OK=0 KO=1 confirm=yes [ "${1-}" == "-y" ] && confirm=no [ ! -f $SRC ] && echo "$SRC n'existe pas, abandon">&2 && exit $KO if [ "$confirm" == "yes" ]; then echo "Ce script va écraser la conf locale (statique) d'unbound pour $DOM (avec les $(egrep -c '^[a-z]' $SRC) hosts de $SRC)" echo "Continuer [o/N] ?" read rep [ "$rep" != "o" ] && echo "Abandon" && exit $OK fi # backup conf actuelle cp -af $DST $BAK cat <<EOF > $DST # fichier généré automatiquement d'après $0 server: # pour qu'il accepte de donner des ip privées dans les réponses private-domain: "lan.domain.tld" # notre domaine fictif statique local-zone: "lan.domain.tld." static # la liste d'après $SRC EOF awk '/^[a-z]/ { printf(" local-data: "%s.'$DOM'. IN A %s"n", $1, $2) printf(" local-data-ptr: "%s %s.'$DOM'"n", $2, $1) }' < $SRC >> $DST if unbound-checkconf then if [ "$confirm" == "yes" ]; then echo "Conf OK, recharger unbound [o/N] ?" read rep [ "$rep" != "o" ] && echo "Sortie sans rechargement, unbound UTILISE TOUJOURS l'ancienne configuration" && exit $OK fi unbound-control reload else echo "Conf KO (cf le résultat généré dans $BAKO), on remet l'ancienne" cp -af $DST $BAKO cp -af $BAK $DST fi -- Daniel À une table, le nombre 13 n'est à craindre que si il n'y a à manger pour 12. Grimod de la Reynière
Marc Chantreux
salut Daniel et merci pour ta réponse détaillée,
Pour ce besoin, j'utilise mon résolveur local (unbound), avec - la liste `host ip` dans un /etc/unbound/hosts.list - un /root/bin/refresh_unbound_local_zone.sh qui génère un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)
a ce stade, je vois déja des solutions plus simples comme un wrapper qui me permettrait d'éditer /etc/hosts en user. a vrai dire je pense même que c'est une meilleure solution parceque ca fonctionnerait sur les unices qui n'ont pas de glibc. en tout cas merci encore marc
salut Daniel et merci pour ta réponse détaillée,
Pour ce besoin, j'utilise mon résolveur local (unbound), avec
- la liste `host ip` dans un /etc/unbound/hosts.list
- un /root/bin/refresh_unbound_local_zone.sh qui génère
un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la
nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)
a ce stade, je vois déja des solutions plus simples comme un wrapper qui
me permettrait d'éditer /etc/hosts en user.
a vrai dire je pense même que c'est une meilleure solution parceque ca
fonctionnerait sur les unices qui n'ont pas de glibc.
Pour ce besoin, j'utilise mon résolveur local (unbound), avec - la liste `host ip` dans un /etc/unbound/hosts.list - un /root/bin/refresh_unbound_local_zone.sh qui génère un /etc/unbound/unbound.conf.d/local.conf et recharge unbound si la nouvelle conf n'a pas de pb de syntaxe (sinon il remet l'ancienne)
a ce stade, je vois déja des solutions plus simples comme un wrapper qui me permettrait d'éditer /etc/hosts en user. a vrai dire je pense même que c'est une meilleure solution parceque ca fonctionnerait sur les unices qui n'ont pas de glibc. en tout cas merci encore marc
Nisar JAGABAR
Salut,
$ export HOSTALIASES=~/.hosts $ echo 127.0.0.1 wow> $HOSTALIASES $ ping wow ping: wow: Aucune adresse associée avec le nom de l'hôte
Par ailleurs, getaddrinfo est plus simple à utiliser que gethostbyname
: ça te retourne les resolutions avec tous les type de familles ; et il
ne faut pas oublier ce buffer overflow (aka "GHOST") :
https://www.qualys.com/2015/01/27/cve-2015-0235/GHOST-CVE-2015-0235.txt