HOSTALIASES ne fonctionne pas sur debian?

Le
Marc Chantreux
salut à tous,

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

du coup, là je sêche. quelqu'un a une idée?

d'avance merci
marc
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
didier.gaumet
Le #26525863
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
Le #26525870
salut Basile,
Ca pourrait être lié à /etc/nsswitch.conf voir nnswitch.conf(5)

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
Le #26525868
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
Daniel Caillibaud
Le #26525881
Le 13/09/19 à 15h46, Marc Chantreux
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
Le #26525894
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
Nisar JAGABAR
Le #26526064
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


Il me semble que ping n'utilise pas gethostbyname mais getaddrinfo:
bash$ sudo ltrace ping google.com
__cxa_atexit(0x5574d608c060, 0, 0x5574d6092328, 0) = 0
cap_get_proc(0x7f1acd5be718, 1, 3, 32) = 0x5574d71af294
cap_init(0x5574d71af294, 0x5574d71af29c, 0x5574d71af290, 0x7f1acd4fcd17)
= 0x5574d71af2c4
cap_get_flag(0x5574d71af294, 12, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 1, 1, 0x5574d60923e0) = 0
cap_get_flag(0x5574d71af294, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 1, 1, 0x5574d60923e4) = 0
cap_set_proc(0x5574d71af2c4, 1, 0x3000, 4096) = 0
prctl(8, 1, 0x3000, 0x7f1acd4fcd47) = 0
getuid() = 0
setuid(0) = 0
prctl(8, 0, 0x3000, 0) = 0
cap_free(0x5574d71af2c4, 0, 0x3000, 0x7f1acd4fd0aa) = 0
cap_free(0x5574d71af294, 1, 0, 0x5574d71af010) = 0
getuid() = 0
geteuid() = 0
setlocale(LC_ALL, "") =
"LC_CTYPE=en_US.UTF-8;LC_NUMERIC="...
bindtextdomain("iputils", "/usr/share/locale") = "/usr/share/locale"
textdomain("iputils") = "iputils"
strlen("ping") = 4
getopt(2, 0x7fff8da6a5f8, "h?4bRT:6F:N:aABc:dDfi:I:l:Lm:M:n"...) = -1
cap_get_proc(13, 1, 1, 0) = 0x5574d71af2c4
cap_get_flag(0x5574d71af2c4, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 0, 1, 0x7fff8da6a44c) = 0
cap_set_proc(0x5574d71af2c4, 0, 8192, 0) = 0
cap_free(0x5574d71af2c4, 0x5574d71af2cc, 8192, 0x7f1acd4fcd47) = 0
__errno_location() = 0x7f1acd3def80
socket(2, 2, 1) = -1
socket(2, 3, 1) = 3
__errno_location() = 0x7f1acd3def80
socket(10, 2, 58) = -1
socket(10, 3, 58) = 4
cap_get_proc(13, 0, 58, 0x7f1acd4fdac7) = 0x5574d71af2c4
cap_get_flag(0x5574d71af2c4, 13, 1, 0x7fff8da6a454) = 0
cap_set_flag(0x5574d71af2c4, 0, 1, 0x7fff8da6a44c) = 0
cap_set_proc(0x5574d71af2c4, 0, 0, 0) = 0
cap_free(0x5574d71af2c4, 0x5574d71af2cc, 0, 0x7f1acd4fcd47) = 0
getaddrinfo("google.com", nil, 0x7fff8da6a4b0, 0x7fff8da6a498) = 0
inet_aton("google.com", { 0 }) = 0
...
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
--
Nisar JAGABAR
,= ,-_-. =.
((_/)o o(_))
`-'(. .)`-'
_/
Publicité
Poster une réponse
Anonyme