Newsgroup: it.comp.java
Titolo: MAC address da IP

Ciao,
Ho un programma che gira in una rete locale, diciamo che da un file
leggo degli ip :
192.168.0.1
.
.
192.168.0.10
Ho un modo per ricavarne il mac address ?
Ovvio che gli IP devono necessariamente essere della rete locale e non
indirizzi Internet pubblici.
Se e' importante, questo programma girera' su una VM su linux (debian
per l'esattezza).
Grazie
MarLaw

Qualcuno mi ha risposto in privato dicendomi se arp mi dicesse nulla :)
Si mi dice, certo che magari c'era un modo migliore per farlo con una
classe java, o forse devo fare eseguire al mio codice il comando arp e
poi leggermi la risposta ?
Comunque, per chi mi ha scritto in pvt ( Integralista GNUslamico,
nonche' allevatore di bug da combattimento) se ci fosse un email valida
ti avrei anche risposto :D
Per la jvm ho semplicemente scaricato da sun il file bin, estratto e
opla' :D
Cheers, 
MarLaw

 Ho un modo per ricavarne il mac address ?
Qualche tempo fa ho cercato pure io il metodo. E non l'ho trovato :-(
Ho dovuto crearmi una classe che eseguisse i vari comandi sulle varie
architetture per ricavare il valore. Un bagno di sangue ...
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 writes:
L> Qualcuno mi ha risposto in privato dicendomi se arp mi dicesse
In privato ???? Sicuro ????
L> Si mi dice, certo che magari c'era un modo migliore per
L> farlo con una classe java, o forse devo fare eseguire al mio codice
L> il comando arp e poi leggermi la risposta ?
Temo che sia la via più  breve. Per beccare il MAC address devi andare
tanto in basso nello stack del protocollo di rete, e questa è una cosa
system-dependent.
La mia  idea sarebbe  di addomesticare l'output  di arp con  uno shell
script prima  di darlo  in pasto a  Java. Shell  coi suoi comandi  è a
parer mio ancora un po' più tosta in questo rispetto a Java.
L> Comunque, per chi mi ha scritto in pvt ( Integralista GNUslamico,
L> nonche' allevatore di bug da combattimento) se ci fosse un email
L> valida ti avrei anche risposto :D
sa...@spammer.impiccati.it
 è il falso e-mail che ho messo in campo PER
I POST USENET 10 anni fa grazie all'educazione di chi considera la mia
mailbox come un cestino dei rifiuti.
L> Per la jvm ho semplicemente scaricato da sun il file bin, estratto
L> e opla' :D
Non sei passato per il metapacchetto quindi... Hai mai avuto problemi
con libc e libc++ ?
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 parer mio ancora un po' più tosta in questo rispetto a Java.
Ho provato arp su linux e solaris, ovviamente due output totalmente 
diversi. Non trovo, ma non sono certo che non esista, l'eventuale 
funzione C di sistema che possa fare quello che fa il comando; se ci 
fosse si potrebbe usare un pò di codice C per ottenere il MAC e poi 
usare il tutto da java. Però, dato che i MAC address non cambiano ogni 
giorno, forse la via più breve è farsi effettivamente uno script shell 
da lanciare una volta ogni tanto (o ogni volta che si aggiunge qualche 
dispositivo di rete) e che crei un file da leggere poi con java.
Attenzione che, almeno in linux e solaris, non è detto che la tavola di 
MAC address di una macchina contenga tutto quello che c'e' sulla rete. 
La procedura che uso io quando mi serve (a mano) il MAC di una macchina 
è farci prima un ping e poi usare il comando arp.
bye
DKano

 writes:
D> Ho provato arp su linux e solaris, ovviamente due output totalmente
D> diversi. Non trovo, ma non sono certo che non esista, l'eventuale
D> funzione C di sistema che possa fare quello che fa il comando;
Se  lo fa  il  comando, di  andare a  leggere  la tabella,  lo fa  una
funzione in C  che a naso appartiene a quelle  dello stack TCP/IP. Che
su Solaris e Linux è differente (se non ricordo male quello di Solaris
è quello del BSD, quello di Linux è stato rifatto da Cox e soci).
D> se
D> ci fosse si potrebbe usare un pò di codice C per ottenere il MAC e
D> poi usare il tutto da java. Però, dato che i MAC address non
D> cambiano ogni giorno, forse la via più breve è farsi effettivamente
D> uno script shell da lanciare una volta ogni tanto (o ogni volta che
D> si aggiunge qualche dispositivo di rete) e che crei un file da
D> leggere poi con java.  
Lo shell script  è un po' più leggero  da aggiornare per l'adattamento
alle varie piattaforme rispetto al codice C a parer mio.
D> Attenzione che, almeno in linux e solaris,
D> non è detto che la tavola di MAC address di una macchina contenga
D> tutto quello che c'e' sulla rete.
Che  sappia io  è  una cache  degli IP  risolti  in un  ARP, quindi  è
necessario che le due macchine si siano parlate "di recente"...
D> La procedura che uso io quando mi
D> serve (a mano) il MAC di una macchina è farci prima un ping e poi
D> usare il comando arp.  
Idem io :)


secondo me no.
Un server dhcp usa il macaddress ma entrano in gioco altre variabili.
Ipotiziamo una formula che dato il mac restituisca un ip:
ip(aabbccdd...) = 10.100.100.3
Ok, ma se il dhcp è configurato per assegnare indirizzi solo in
determinati range di valori (cosa mooolto frequente, ad esempio a casa
mia è cosi...) e l'ip calcolato non rientra in tali range, presumo che
il server faccia altre elaborazioni per ottenere un indirizzo valido.
Inoltre, su alcuni dispositivi il mac è configurabile dall'utente.
Infine, che dire di un pc che ha un indirizzo ip fisso, tipicamente i
server?
imho, dopo una rapida occhiata a java mi sembrerebbe assai strano che
tra le varie classi non esista qualcosa per ottenere l'ip, risolto poi
dalla vm a seconda della piattaforma in uso.
baiBai
AS

Il sistema su cui lavorero' sara' linux con bash shell, e non mi
importa che sia portabile, ovvero, non e' un problema riscrivere lo
script in caso di bisogno, ma diciamo che per ora mi serve solo per
linux, con bash.
Gian Uberto mi suggeriva AWK, mai sentito, ora cerco nella liberia e
vedo come funziona.
Prima gli mando un ping, se risponde vado avanti, altrimenti
automaticamente non ci sono host con quell'ip attivi in rete ( o hanno
disattivato il servizio ICMP e li, come la si risolve ?)
Se il ping risponde, nella arp cache ho automaticamente il mac address,
lancio il comando , leggo l'output con java (forse con awk?)  e ottengo
il mac address :D
Corretto ?
MarLaw

 writes:
L> Il sistema su cui lavorero' sara' linux con bash shell, e non mi
L> importa che sia portabile, ovvero, non e' un problema riscrivere lo
L> script in caso di bisogno, ma diciamo che per ora mi serve solo per
L> linux, con bash.
L> Gian Uberto mi suggeriva AWK,
Aho, Weinberger & Kernighan. Pare che solo il Perl sia piů potente ad
elaborare le stringhe :)
L> mai sentito, ora cerco nella liberia
L> e vedo come funziona. 
man  awk. Se  hai  qualche vecchia  volpe a  tiro  che ha  lo Unix  di
Kernighan & Pike sei a posto :)
L> Prima gli mando un ping, se risponde vado
L> avanti, altrimenti automaticamente non ci sono host con quell'ip
L> attivi in rete ( o hanno disattivato il servizio ICMP e li, come la
L> si risolve ?)
Su rete locale ha poco senso  rifiutare gli ICMP(*), a meno che non ci
siano varie linee di firewall oltre quello perimetrale.
(*) ping č un buon diagnostico anche ti garantisce che la macchina sia
morta ma non che, viceversa, sia in uno stato utilizzabile. Una vecchia
manpage che ho perso di vista lo citava come strumento per testare quali
rami di DARPA erano sopravvissuti ad un attacco sovietico...
L> Se il ping risponde, nella arp cache ho automaticamente il mac
L> address, lancio il comando , leggo l'output con java (forse con
L> awk?)  e ottengo il mac address :D
Corretto.  awk ti permette  di sgrezzare  l'output di  arp un  po' piů
comodamente che con Java (IMHO).
Divertiti, dovresti poter usare il valore ritornato da exitValue() del
Process creato da exec con questo scriptino...
#!/bin/bash
#
# Per l'uomo col martello ogni problema č un chiodo. Non di solo Java
# vive il programmatore
if [ $# != 1 ]
then
    echo "-- Uso :"$0" host"
    exit 1
fi
if ping -c 1 $1 > /dev/null 2> /dev/null
then
    if out=`/usr/sbin/arp gastone | awk '/[0-9]/ { print $3}'`
    then
	echo $out
	exit 0
    else
	echo "-- "$1" non ci sono dati"
	exit 3
    fi
else
    echo "-- "$1" non risponde"
    exit 2
fi
# fine script
BTW, dovresti aver ricevuto il mio e-mail se ti servisse per chiedermi
qualcosa...


JAVA SE 6 avra' nativo i metodi per recupera il MAC address
Dalla classe java.net.NetworkInterface puoi richiamare il metodo
getHardwareAddress() che ti ritorna un byte[] rappresentante il MAC
address della scheda di rete (se presente).
L'oggetto java.net.NetworkInterface  lo puoi ottenere richiamando il
metodo statico getByInetAddress passandogli un java.net.InetAddress
https://mustang.dev.java.net/
Ovviamente bisognera' aspettare... ma visto che tutti i source di
Mustang (ossia java se 6) sono gia' distribuiti.. puoi scaricarteli e
scopiazzare l'implementazione del metodo getHardwareAddress.
Per la cronaca ho gia' verificato perche' serviva anche a me...:
l'implementazione utilizza del codice nativo per le diverse piattaforme
alla fine.. per me non andava bene perche' non potevo (volevo)
distribuire il codice (e supportarlo) per le diverse piattaforme su cui
gira la mia applicazione.. ma visto che a te in questo momento ti basi
su una unica precisa piaffaforma potrebbe esserti comodo..
ciao ciao

Pardon, Roberto.
..zzo è JAVA SE 6? E' in vista una nuova versione di java?
maronna, altra roba.... :((
AS

 maronna, altra roba.... :((
:-)
bye
DKano

Ho risolto con uno script e un Process , comununque l'indirizzo che
interessava quello fisico di una QUALUNQUE macchina in lan.
Quindi prima ping per aggiornare la arp cache e poi guardare nella
cache il mac se e' online, altrimenti e' offline.