linux系统环境下,怎样在后台才能获取到mac地址?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统环境下,怎样在后台才能获取到mac地址?相关的知识,希望对你有一定的参考价值。
搞软件开发的,需要在后台获取mac地址,(java)获取。系统环境是linux环境!
开发环境是linux!
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);
-------------------------------------------------------------------------
本程序可以正确获得本机IP地址和网卡"eth0"的MAC地址,已经在windowsXP和ubuntu-Linux上测试过
(注意:如果有多块网卡,可能出错)
下面给出代码:
import java.net.*;import java.util.*;
public class Test public static void main(String[] args) Test t = new Test(); System.out.println(t.getLocalIP()); System.out.println(t.getMacAddr());
public String getMacAddr() String MacAddr = ""; String str = ""; try NetworkInterface NIC = NetworkInterface.getByName("eth0"); byte[] buf = NIC.getHardwareAddress(); for (int i = 0; i < buf.length; i++) str = str + byteHEX(buf[i]); MacAddr = str.toUpperCase(); catch (SocketException e) e.printStackTrace(); System.exit(-1); return MacAddr;
public String getLocalIP() String ip = ""; try Enumeration<?> e1 = (Enumeration<?>) NetworkInterface .getNetworkInterfaces(); while (e1.hasMoreElements()) NetworkInterface ni = (NetworkInterface) e1.nextElement(); if (!ni.getName().equals("eth0")) continue; else Enumeration<?> e2 = ni.getInetAddresses(); while (e2.hasMoreElements()) InetAddress ia = (InetAddress) e2.nextElement(); if (ia instanceof Inet6Address) continue; ip = ia.getHostAddress(); break; catch (SocketException e) e.printStackTrace(); System.exit(-1); return ip;
/* 一个将字节转化为十六进制ASSIC码的函数 */ public static String byteHEX(byte ib) char[] Digit = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ; char[] ob = new char[2]; ob[0] = Digit[(ib >>> 4) & 0X0F]; ob[1] = Digit[ib & 0X0F]; String s = new String(ob); return s; 参考技术A 你是要啥MAC地址?本机的?如果是本机的话可以用命令ipconfig得到包含mac地址的网络参数,在提取出啦就是追问
我问的是具体代码怎么写!
追答找到一个更简单的方法来实现:cat /sys/class/net/eth0/address 注意是否需要更换网卡名称。Ubuntu 下通过
SELinux使用详解
SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。Linux系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅能获取到本应获取的资源。
例如,你在电脑上安装了一个美图软件,当你在全神贯注地使用它给照片进行美颜时,它却在后台默默监视着你的QQ聊天记录,而这显然不应该是它应做的事情,如果是监视电脑中的图片资源还说的过去。SELinux安全子系统就是为了杜绝此类情况而设计的,它能够从多方面监控违法行为:对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。“SELinux域”和“SELinux安全上下文”是SELinux的双保险,使服务程序无法进行越权操作。
SELinux服务有三种运行模式,具体如下:
- Enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
- Permissive:遇到服务越权访问时,只发出警告而不强制拦截。
- Disabled:对于越权的行为不警告也不拦截。
selinux的配置文件位置:/etc/selinux/config,链接文件位置:/etc/sysconfig/selinux
本人的机器环境
ip地址 | 操作系统 | 安装软件 |
---|---|---|
192.168.2.211 | Centos 7 64位 | yum方式安装httpd |
1、查询selinux服务的工作状态sestatus
2、查看selinux的运行模式getenforce
3、修改selinux的运行模式
setenforce 0 #将运行模式设置为Permissive,即临时关闭selinux,重启系统后失效
setenforce 1 #将运行模式设置为Enforcing,如果配置文件里是Permissive,重启系统后失效
4、修改配置文件,使其永久关闭selinux,重启系统后生效
注:配置文件里定义的是selinux的默认运行状态,可以理解为系统重启后的状态
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i ‘s/SELINUXTYPE=targeted/#&/‘ /etc/selinux/config
setenforce 0
5、查询安全上下文相关命令,使用-Z参数
查看目录的安全上下文,使用ls -Z
查看文件的安全上下文
查看进程的安全上下文,使用ps -Z
查看selinux用户的安全上下文,使用id -Z
6、使用selinux需要记住的四个命令
- semanage:该命令用于管理selinux的安全上下文,可查看、添加、修改和删除进程、文件或目录的安全上下文策略
- restorecon:执行semanage命令后,需要使用restorecon命令将设置好的安全上下文立即生效,可以加上-Rv参数对指定的目录进行递归操作,以及显示修改过程
- getsebool:查询selinux域的安全策略,需要加上-a参数
- setsebool:修改selinux域的安全策略的规则,加上-P参数使其永久且立即生效
7、修改httpd服务的默认网站目录,来配置selinux
(1)安装httpd服务,并设置firewalld防火墙允许http服务
yum -y install httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
(2)将网站数据目录修改为/home/wwwroot目录,并创建首页文件
mkdir /home/wwwroot
echo "The New Web Directory" > /home/wwwroot/index.html
(3)修改httpd服务的配置文件vim /etc/httpd/conf/httpd.conf
(4)启动httpd服务,并验证效果systemctl start httpd
通过浏览器访问发现显示上图页面,而这正是selinux在捣鬼。
(5)查看selinux运行状态,并关闭它
getenforce
setenforce 0
再次刷新页面,就会看到正常的网页内容了。
我们把httpd服务的网站数据默认保存目录修改为/home/wwwroot,这显然违反了selinux的监管原则,/home目录是用来存放普通用户的家目录数据的,而现在httpd服务却要去获取普通用户家目录中的数据,selinux自然是不允许了。我们现在把selinux服务恢复到强制启用安全策略模式,然后修改selinux的安全上下文即可。
(6)启用selinux,并且对比/var/www/html和/home/wwwroot目录的安全上下文有什么区别
setenforce 1
ls -Zd /var/www/html/
ls -Zd /home/wwwroot/
selinux安全上下文是由用户段、角色段和类型段等多个信息项组成的,用户段system_u表示系统进程的身份,角色段object_r表示文件目录的角色,类型段httpd_sys_content_t表示网站服务的系统文件。即然如此,那我们只将/home/wwwroot目录的安全上下文修改为跟原始网站目录一样就行了。
(7)安装所需命令软件包yum -y install policycoreutils-python.x86_64
(8)将/home/wwwroot目录添加一条安全上下文
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
我们再通过浏览器访问一下,能正常显示网页内容,OK。
8、开启httpd服务的个人用户主页功能,来配置selinux
(1)修改配置文件,开启个人用户主页功能vim /etc/httpd/conf.d/userdir.conf
(2)切换到普通用户,并且创建网站目录及首页文件
useradd xuad
su - xuad
mkdir public_html
echo "This is user‘s website" > public_html/index.html
chmod -Rf 755 /home/xuad/
exit
systemctl restart httpd
在浏览器地址栏里输入“http://192.168.2.223/~xuad”,不出所料,报错了。
httpd服务既然提供了个人用户主页功能,那么用户的网站目录自然是存在在用户的家目录中,所以应该不是selinux安全上下文的问题。我们前面有提到过selinux域,那么是不是被它给阻止了呢?
(3)查看与http协议相关的安全策略getsebool -a | grep http
这么多的安全策略规则,我们没必要逐个理解它们,只需要通过名字大致猜测出相关的策略用途就可以了。那么通过名字我们很容易能发现应该是httpd_enable_homedirs规则,而此规则是off,我们应该将其修改为on。
(4)修改selinux域策略规则,该操作永久生效,并且立即生效setsebool -P httpd_enable_homedirs=on
然后刷新一下页面,能正常显示首页内容了。
9、配置基于端口号的多站点,来配置selinux
(1)创建网站目录及首页文件
mkdir -p /home/wwwroot/8111
mkdir -p /home/wwwroot/8222
echo "port:8111" > /home/wwwroot/8111/index.html
echo "port:8222" > /home/wwwroot/8222/index.html
(2)修改配置文件,增加两个监听端口,并且添加两个虚拟站点配置vim /etc/httpd/conf/httpd.conf
(3)查看selinux安全上下文
ls -Zd /home/wwwroot/8111/
ls -Zd /home/wwwroot/8222/
前面我们修改了/home/wwwroot目录的安全上下文,此时我们新建的两个目录默认继承了上层目录的安全上下文,这里无须再修改了。现在重启httpd服务systemctl restart httpd
奇怪,启动时居然报错了。因为8111和8222端口不属于httpd服务,但现在却被httpd服务监听使用了,所以selinux会拒绝httpd服务使用这两个端口。
(4)查看与http协议相关的selinux服务允许的端口列表semanage port -l | grep http
显然http_port_t规则里没有8111和8222这两个端口号。
(5)往http_port_t规则里添加端口号
semanage port -a -t http_port_t -p tcp 8111
semanage port -a -t http_port_t -p tcp 8222
此操作立即生效,且永久生效,无须使用restorecon命令。
(6)配置firewalld防火墙允许8111和8222端口
firewall-cmd --permanent --add-port=8111/tcp
firewall-cmd --permanent --add-port=8222/tcp
firewall-cmd --reload
firewall-cmd --list-ports
(7)重启httpd服务,并通过浏览器验证systemctl restart httpd
网站页面正常显示,OK。
以上是关于linux系统环境下,怎样在后台才能获取到mac地址?的主要内容,如果未能解决你的问题,请参考以下文章
求助 ASP.net 后台循环添加按钮,如何才能获取到点击按钮获取到当前点击按钮的名称