1.背景

我们需要在没有root权限的普通用户下,执行java程序,此java程序中需要使用到jpcap来接收网卡的包,jpcap需要root权限才能够加载网卡信息,由于此用户并不能拿到root权限,所以需要给java虚拟机提权来解决问题。

2.suid提权

给java虚拟机赋予suid权限,让java -jar命令在普通用户下执行时使用的是拥有者的权限,所以java的拥有者需要是root用户

#创建用户
useradd chun
passwd chun

#给java虚拟机赋予suid权限
chmod u+s /usr/java/jdk-1.8.0/bin/java

3.切换用户执行

su chun
java -jar text.jar

会发现报错:
error while loading shared libraries:libjli.so:cannot open shared object file:No such file or directory

这是由于给java虚拟机设置suid权限后,Linux 会为使用 setcap 或 suid 的程序禁用掉 LD_LIBRARY_PATH,所以java虚拟机就找不到动态链接库了。

我们只需要将libjli.so目录加入到动态链接库中即可

# 查看libjli.so文件路径,获取到jdk下的目录,/usr/java/jdk1.8.0/lib/amd64/jli
locate libjli.so

#两种方式
#1.加入到ld.so.conf下
echo "/usr/java/jdk1.8.0/lib/amd64/jli/" > /etc/ld.so.conf
#2.在ld.so.conf.d下新建一个文件,将路径加入文件中
touch /etc/ld.so.conf.d/java1.8.0.conf
echo "/usr/java/jdk1.8.0/lib/amd64/jli/" > /etc/ld.so.conf.d/java1.8.0.conf

# 更新动态链接库缓存,执行
ldconfig

再次切换用户执行,即可正常运行。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐