jdk1.5 在Linux系统下如何实现根据ip获得客户端MAC地址

在站内搜了一下,发现只有在Windows系统下实现根据ip获得客户端MAC地址的例子。
主要是根据命令“nbtstat -a ip地址”来获得的。
在Linux下有类似的命令吗?
在Linux下怎么实现呢?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetMacFromLinux {

public static String callCmd(String[] cmd) {
    String result = "";
     String line = "";
     try {
         Process proc = Runtime.getRuntime().exec(cmd);
         InputStreamReader is = new InputStreamReader(proc.getInputStream());   
         BufferedReader br = new BufferedReader (is);   
         while ((line = br.readLine ()) != null) {  
             result += line;
         }  
     }
    catch(Exception e) {
        e.printStackTrace();
    }
    return result;
}

public static String  getMac(final String ip){
    String[] cmd = {
            "/bin/sh",
            "-c",
            "ping " +  ip + " -c 2 && arp -a"
            };
    String result = callCmd(cmd);
    Pattern pattern = Pattern.compile("((([0-9,A-F,a-f]{1,2}:){1,5})[0-9,A-F,a-f]{1,2})");        
    Matcher matcher = pattern.matcher(result);       
    while(matcher.find()){   
         result = matcher.group(1);
          if(result.indexOf(ip) <= result.lastIndexOf(matcher.group(1))) {
              break;
          }
    }

    return result;

}

/**
 * @param args
 */
public static void main(String[] args) {
    System.out.println(getMac("192.168.199.42"));

}

}
//在ubuntu 7.10下测试通过

参考
http://www.iteye.com/topic/255210

下面列出了java读取MAC地址的工具方法,可以读取windows和非windows操作系统(linux,unix)下的MAC地址。如果你的操作系统很特殊的话,可以对方法进行扩充,原理类似的。

[code="java"]
/*

  • Created on 2005-6-5
  • Author stephen
  • Email zhoujianqiang AT gmail DOT com
  • CopyRight(C)2005-2008 , All rights reserved. */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

/**

  • 与系统相关的一些常用工具方法.
  • @author stephen
  • @version 1.0.0
    */
    public class SystemTool {

    /**

    • 获取当前操作系统名称.
    • return 操作系统名称 例如:windows xp,linux 等. */ public static String getOSName() { return System.getProperty("os.name").toLowerCase(); }

    /**

    • 获取unix网卡的mac地址.
    • 非windows的系统默认调用本方法获取.如果有特殊系统请继续扩充新的取mac地址方法.
    • @return mac地址
      */
      public static String getUnixMACAddress() {
      String mac = null;
      BufferedReader bufferedReader = null;
      Process process = null;
      try {
      process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
      bufferedReader = new BufferedReader(new InputStreamReader(process
      .getInputStream()));
      String line = null;
      int index = -1;
      while ((line = bufferedReader.readLine()) != null) {
      index = line.toLowerCase().indexOf("hwaddr");// 寻找标示字符串[hwaddr]
      if (index >= 0) {// 找到了
      mac = line.substring(index +"hwaddr".length()+ 1).trim();// 取出mac地址并去除2边空格
      break;
      }
      }
      } catch (IOException e) {
      e.printStackTrace();
      } finally {
      try {
      if (bufferedReader != null) {
      bufferedReader.close();
      }
      } catch (IOException e1) {
      e1.printStackTrace();
      }
      bufferedReader = null;
      process = null;
      }

      return mac;
      }

    /**

    • 获取widnows网卡的mac地址.
    • @return mac地址
      */
      public static String getWindowsMACAddress() {
      String mac = null;
      BufferedReader bufferedReader = null;
      Process process = null;
      try {
      process = Runtime.getRuntime().exec("ipconfig /all");// windows下的命令,显示信息中包含有mac地址信息
      bufferedReader = new BufferedReader(new InputStreamReader(process
      .getInputStream()));
      String line = null;
      int index = -1;
      while ((line = bufferedReader.readLine()) != null) {
      index = line.toLowerCase().indexOf("physical address");// 寻找标示字符串[physical address]
      if (index >= 0) {// 找到了
      index = line.indexOf(":");// 寻找":"的位置
      if (index>=0) {
      mac = line.substring(index + 1).trim();// 取出mac地址并去除2边空格
      }
      break;
      }
      }
      } catch (IOException e) {
      e.printStackTrace();
      } finally {
      try {
      if (bufferedReader != null) {
      bufferedReader.close();
      }
      } catch (IOException e1) {
      e1.printStackTrace();
      }
      bufferedReader = null;
      process = null;
      }

      return mac;
      }

    /**

    • 测试用的main方法.
    • @param argc
    • 运行参数. */ public static void main(String[] argc) { String os = getOSName(); System.out.println(os); if(os.startsWith("windows")){ //本地是windows String mac = getWindowsMACAddress(); System.out.println(mac); }else{ //本地是非windows系统 一般就是unix String mac = getUnixMACAddress(); System.out.println(mac); } } }[/code]

[url]http://www.coffer.com/mac_info/locate-unix.html[/url]

另外,如果用户设置了locale,依赖"hwadd"特征这样的字符串是不可靠的

ping 192.168.199.42 -c 10 && arp -a;