Newsgroup: it.comp.os.linux.iniziare
Titolo: bash: ottenere ip (pulito) di un server

$ host localhost
localhost has address 127.0.0.1
 
però senza 'localhost has address' e sporcizia varia.
 
In pratica voglio fare questo:
 
if [ $IP_DI_UN_SERVER == "127.0.0.1" ]; then
     # fai qualcosa
fi

Addi' 02 dic 2017 08:41:51, alex scrive:

Non so aiutarti, pero' guarda da me cosa mi dice:
 
[~]yoda_$: host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Host localhost not found: 3(NXDOMAIN)
 
e allora la terza riga cosa vuol dire? ciao
(debian stabile amd64)
 
-- 
bye, Yoda
 

 (debian stabile amd64)
 
Mah.
Cmq possibile che non esiste un comando tipo:
 
$ host-ip <hostname>
xxx.xxx.xxx.xxx
 
la cosa più semplice del mondo


IP_DI_IN_SERVER=$(host "nome_del_server" |awk '/has address/ {print $4}')
 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 IP_DI_IN_SERVER=$(host "nome_del_server" |awk '/has address/ {print $4}')
 
Sperando che *has address* ci sia (non si sa mai da una versione all'altra).
Cmq bisogna sempre ricorrere a queste *accrocchiate*, come immaginavo :D


Ad ogni modo queste sono le prime righe del mio /etc/hosts
 
127.0.0.1 a
127.0.0.1 b
127.0.0.1 a
127.0.0.1 localhost
 
In pratica vorrei sapere se l'host 'b' è incluso in tale file.
In caso contrario, deve essere dato il comando
 
sudo sed -i "1i127.0.0.1 b" /etc/hosts
 
In pratica sto facendo uno script per configurare automaticamente dei 
virtual-host per apache.
In pratica se non metto qualche controllo ogni volta che tale script 
viene eseguito, mi ritrovo un file pieno di voci duplicate:
 
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 b
127.0.0.1 a
127.0.0.1 b
127.0.0.1 a
127.0.0.1 localhost

Il 02/12/2017 09:41, alex ha scritto:

Prova questo:
	dig +short <host>
 
angelo

 angelo
 
Forma completa:
   if [ `dig +short @
8.8.8.8
 <nome_host>` = "x.y.z.w" ]; then ...
 
per nome_host pubblico e inoltro richiesta a server dns di Google.
 
angelo

Il 02/12/2017 12:09, angelo ha scritto:

$ dig +short localhost
127.0.0.1
 
OK!!!
 
$ dig +short window-resources.local
 
non esce niente

 per nome_host pubblico e inoltro richiesta a server dns di Google.
 
Per nome_host *pubblico* e inoltro richiesta?
Cosa c'entra google?
 
Chiedo scusa, ma non ti ho capito molto bene :)


Dig effettua una query  al/ai server dns elencati in /etc/resolv.conf, 
salvo che non venga specificato con @x.y.z.w un server dns differente e 
8.8.8.8 e' il server dns di Google.
 
E' solo una precisazione per completezza, man dig puo' spiegarlo meglio 
di me.
 
angelo

 non esce niente
 
Mentre host ti da' qualcosa?
Strano perche' la definizione e' la stessa di "dns lookup" per tutti e due.
Prova senza +short per vedere la risposta integrale.
 
angelo
 

 127.0.0.1 localhost
 
Perche' allora non agire direttamente su /etc/hosts?
 
TMP="quelchetipare.local"
if ! [[ `grep -w $TMP /etc/hosts` ]]; then
   sudo sed -i "1i127.0.0.1 \t$TMP" /etc/hosts
fi
 
angelo

 Prova senza +short per vedere la risposta integrale.
 
$ dig window-resources.local
 
; <<>> DiG 9.10.3-P4-Ubuntu <<>> window-resources.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 64601
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;window-resources.local.		IN	A
 
;; AUTHORITY SECTION:
.			10800	IN	SOA	
a.root-servers.net
. 
nstld.verisign-grs.com
. 
2017120300
 
1800 900 604800 86400
 
;; Query time: 39 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Dec 03 12:06:19 CET 2017
;; MSG SIZE  rcvd: 126
 

Il 03/12/2017 12:10, alex ha scritto:
 
Scusa, non sono stato chiaro, intendevo come risponde il comando:
 
"host window-resources.local"
 
Ho postato comunque un'altra possibile soluzione poco fa.
 
angelo
 
 
 

 (debian stabile amd64)
 
Esistono diversi modi per risolvere l'indirizzo
nome <-> IP.
Uno e` usare /etc/hosts, un altro un DNS.
 
Credo che /etc/nsswitch.conf consenta di scegliere
l'ordine o quali modi siano attivi.
 
Detto questo, la terza riga ti dice, penso io, che
il nome "localhost" non e` risolvibile con DNS.
E` risolvibile solo tramite /etc/hosts.
 
bye,
 
-- 
 
piergiorgio

 127.0.0.1 localhost
 
Come scritto da "angelo", fai un "grep" su /etc/hosts
e se il risultato e` negativo aggiungi l'host.
 
bye,
 
-- 
 
piergiorgio

 sudo sed -i "1i127.0.0.1 b" /etc/hosts
 
Aggiungo un'altra cosa.
 
Non credo, ma potrei sbagliare, che /etc/hosts
sia pensato per gestire la risoluzione degli
indirizzi in maniera *dinamica*.
 
Ora, non so quale sia il tuo problema esattamente,
ma se /etc/hosts e` in lettura da qualcuno e tu
lo modifichi, il qualcuno non avra` la modifica.
 
bye,
 
-- 
 
piergiorgio

 fi
 
Occhio che la riga è commentata...
 
$ cat abc
# 127.0.0.1 test.local
 
$ cat main-test.sh
if [[ "grep -w test.local abc" ]]; then
     echo "record dns presente"
fi
 
$ bash main-test.sh
record dns presente
 
Ma che bugiardo :D

 lo modifichi, il qualcuno non avra` la modifica.
 
????
 
 

 ????
 
Se si fa il lookup di "a", per sapere quale IP abbia,
via /etc/hosts, non e` detto che il risultato sia
quello corrente, potrebbe essere quello precedente
all'ultima modifica.
 
bye,
 
-- 
 
piergiorgio

 "host window-resources.local"
 
$ host window-resources.local
Host window-resources.local not found: 3(NXDOMAIN)
 
Il ping però funziona
 
$ ping window-resources.local
PING window-resources.local (127.0.0.1) 56(84) bytes of data.
64 bytes from window-resources.local (127.0.0.1): icmp_seq=1 ttl=64 
time=0.042 ms
64 bytes from window-resources.local (127.0.0.1): icmp_seq=2 ttl=64 
time=0.048 ms
64 bytes from window-resources.local (127.0.0.1): icmp_seq=3 ttl=64 
time=0.031 ms
...
 

 e se il risultato e` negativo aggiungi l'host.
 
# 127.0.0.1 my-site.local
 
in tal caso come la mettiamo?

 usando un DNS locale.
 
fammi capire, mi stai dicendo che c'è un comando tipo:
 
$ set-dns-record my-site.local 127.0.0.1
 
che fa tutto da solo, senza toccare nessun file?
 
Magari :)

 in tal caso come la mettiamo?
 
Vedi che e` una porcata?
Il semplice fatto di poter avere tali record
rende il tutto una porcheria.
 
Si puo` risolvere.
Non usi tali record, escludi i commenti dal
grep, etc., etc.
 
Il metodo piu` pulito, usando /etc/hosts, e`
di avere tale file *sempre* generato in modo
automatico, per ogni record (default + altri),
in toto, cioe` completamente.
 
Quindi hai il controllo al 100% di quello che
c'e` nel file.
Mettendo, sempre in automatico, un bel commento
all'inizio dove c'e` scritto:
 
# This is an automatic generated file
# DO NOT MODIFY
 
Altre operazioni "miste" (mezza configurazione
a mano, mezza in automatico) sono sempre un
rischio e vanno evitate come la peste.
 
bye,
 
-- 
 
piergiorgio

 che fa tutto da solo, senza toccare nessun file?
 
Allora, leggi bene quello che ho scritto.
Non c'e` "senza toccare nessun file", c'e` "senza
toccare /etc/hosts".
 
Che un DNS sia configurabile via file immagino
sia normale, anche se posso sempre immaginare sia
anche modificabile programmaticamente.
 
In ogni caso:
 
stop DNS
modifica conf DNS
start DNS
 
Sarebbe, sempre immagino, una delle possibili
procedure corrette.
Supponendo che il DNS non si rilegga la configurazione
al volo.
 
Puo` anche essere, come menzionato sopra, che si
possa semplicemente interfacciarsi al DNS via
qualche protocollo ed aggiungere o togliere record
dal suo data base.
Magari, in questo caso, sara` lui a capire se tale
record gia` esiste o meno.
 
Qui, forse si, esiste un comando:
 
set-dns-record my-site.local 127.0.0.1
 
Dovresti cercare informazioni su DNS (leggeri
magari) e su /etc/nsswitch.conf (che magari fa
gia` qualcosa al riguardo).
 
bye,
 
-- 
 
piergiorgio

 rischio e vanno evitate come la peste.
 
Trovo molto interessante ciò che dici ma, come già accennato, c'è un 
modo per automatizzare totalmente la creazione di un nuovo 
apache-virtual-host (senza effetti collatarerali se l'apposito script 
viene erroneamente lanciato una seconda volta)?

 gia` qualcosa al riguardo).
 
intanto sto vedendo questi
 
https://linux.die.net/man/5/nsswitch.conf
 
http://goo.gl/KzjtKM
 

 viene erroneamente lanciato una seconda volta)?
 
Se il problema e` la possibilita` di lanciare
due volte lo stesso script, un metodo e`, in
tale script, verificare se il *file* esiste.
In tal caso lo script ritorna un errore, oppure
richiede l'uso di un parametro "-f" (force).
 
Cioe` un procedura e` informare l'utente che
c'e` una possibilita` di errore.
Se poi l'utente decide di continuare, colpa sua.
 
D'altro canto esiste anche "diff", "sort" + "uniq"
e via dicendo.
 
bye,
 
-- 
 
piergiorgio

 Cioè?
 
Certi programmi hanno un "notify" sul file
di configurazione.
Quando questo cambia, loro vengono informati
e lo rileggono.
Potrebbe essere che anche un DNS server faccia
cosi`, e` solo una possibilita`, ma non e` che
sia realmente importante, in questo caso.
 
bye,
 
-- 
 
piergiorgio

 e via dicendo.
 
...
...ma per fare cosa?
 

 ...ma per fare cosa?
 
Per verificare doppioni nei file.
 
bye,
 
-- 
 
piergiorgio

 statico.
 
Metodo un po' laborioso, cmq OK
 
 

 Il ping però funziona
 
Perché ping esegue la risoluzione via NSS, che definisce le regole di ricerca
in /etc/nsswitch.conf (com'è giusto che sia)
 
Enrico

 indirizzi in maniera *dinamica*.
 
Lo è all'incirca, nel senso che NIS e NIS+ distribuiscono il file hosts
(assieme a /etc/passwd e /etc/shadow) sui nodi. Quindi, anche se statico, è
di fatto gestito in maniera dinamica
 
Enrico

 al volo.
 
Dipende da com'è configurato. Per esempio, in BIND o modifichi a mano i file
di zona e poi glie li fai ricaricare (rdnc reload), oppure lo configuri per
aggiungere dinamicamente uno per uno gli host (nsupdate)
 
Enrico

 Metodo un po' laborioso, cmq OK
 
Come scrivevo, secondo me, potrei sbagliare
ovviamente, /etc/hosts non e` pensato per
essere gestito dinamicamente.
 
Quindi, volendo fare le cose pulite, si deve
aggiungere la parte "flessibile" altrove.
 
Come scritto prima, magari un DNS e` meglio,
non saprei.
 
bye,
 
-- 
 
piergiorgio


 
Ma sotto linux questo dns cosè?
Un app (un package), un servizio (tipo apache)?
Deve essere installato?
E' già installato?
Deve essere configurato?
Deve essere avviato... manualmente?

 Cmq bisogna sempre ricorrere a queste *accrocchiate*, come immaginavo :D
 
Bisognerebbe studiare:
 
$ dig +short 
google.com
 
216.58.205.174
$
 
Enrico

 Deve essere avviato... manualmente?
 
Di solito e` un servizio, daemon, vedi "bind".
 
Ve ne sono diversi, magari "bind" e` un po'
troppo enterprise, forse.
 
Questo daemon si puo` usare per risolvere
nome <-> IP, in vari modi.
 
Il file /etc/nsswitch.conf configura anche
come e dove tale risoluzione avviene.
 
bye,
 
-- 
 
piergiorgio


Non sono un esperto di reti ed ammetto la mia incapacità
 
$ dig +short window-resources.local
 
$ host window-resources.local
Host window-resources.local not found: 3(NXDOMAIN)
 
$ php -r "echo gethostbyname('window-resources.local');"
127.0.0.1
 
Come vedete devo ricorrere a php (gli altri sistemi evidentemente non li 
so usare).
Pazienza :)

 in /etc/nsswitch.conf (com'è giusto che sia)
 
OK
 
Ma dimmi una cosa.
C'è un modo per risolvere un hostname semplicemente come lo risolverebbe 
un browser (senza dover apprendere tutti questi concetti)?
Questo è l'unico modo che ho trovato:
 
$ php -r "echo gethostbyname('window-resources.local');"
127.0.0.1
 
anche se bisogna ricorrere a php (sperando che sia installato)

 127.0.0.1
 
A parte che userei python con questo:
$ python -c "import socket; print socket.gethostbyname('
www.google.com
')"
 
O perl con questo:
perl -MSocket -E 'print inet_ntoa(scalar(gethostbyname("
google.com
"))) . "\n"'
 
Il metodo migliore probabilmente è:
$ getent ahostsv4 
google.com
 
 
Enrico

 $ getent ahostsv4 
google.com
 
 
+ getent ahostsv4 window-resources.local
127.0.0.1       STREAM window-resources.local
127.0.0.1       DGRAM
127.0.0.1       RAW
 
Il solito output sporco.

 Il solito output sporco.
 
Vero, ma è un output abbastanza filtrabile e gestibile
 
Enrico


grazie