jNetPcap 在基于 Linux 的 Netbeans Java 项目上的权限



Netbeans 11.2 运行在 Linux Mint 19.2 Cinnamon, Kernel4.15.0-72-generic

我已经将几年前开发的自定义网络数据包嗅探项目从Windows 7转移到Linux。这使用 jNetPcap 来执行实际的数据包捕获。JnetPcap是Libpcap的包装器。

问题:在 Netbeans 中运行我的项目时,出现错误"您无权在该设备上进行捕获"。

将项目编译为一个.jar文件,然后我以root身份运行,一切都很好。从而证明项目代码是正常的,并且问题仅限于缺少权限。

正在使用的"本机共享库"是 libjnetcap.so

本质上,我希望能够在 Netbeans 11.2 中运行/调试此项目

为了解决这个问题,我尝试了很多事情:

  1. 假设访问网络接口的是libjnetcap.so,我尝试使用setuid为其提供提升的权限,但没有效果。我还尝试用sudo setcap cap_net_raw=p ./libjnetpcap.so赋予它功能,同样没有效果。

  2. /usr/bin/java上尝试setuid。这次我可以在不使用sudo的情况下将编译的项目.jar文件运行。但是,Netbeans IDE 不会从桌面图标加载。从终端运行 Netbeans 会引发一条错误消息,指出不允许使用setuid

  3. 我无法在/usr/bin/java上设置功能。文件类型错误?

我在这个论坛上找到了这个:

在您的情况下,pcap需要对网络接口进行低级别访问。由于安全隐患(捕获网络流量、生成任意网络数据包等(,此类访问仅限于特权用户。例如,在 Linux 上,pcap需要用户可以使用CAP_NET_RAW功能。

这听起来像是我的问题,但pcap在哪里?我似乎只有libjnetcap.so库文件。

如果一些善良的灵魂能给我任何指示等,我将不胜感激。

不确定我是否没有回应,因为我的问题真的很晦涩,所以很少有人经历过。或者也许我没有充分描述它。 无论如何,我设法自己解决了它。我在下面描述了解决方案,以防其他人应该体验它。 需要找到正在使用的 java 可执行文件,然后更改其功能。 1. 查找正在使用的 java 可执行文件。输入命令。 爪哇在哪里 这提供了符号链接的路径。功能不能应用于符号链接,因此请按照此操作实现其目标。 这是另一个符号链接,其目标是可执行文件。就我而言,这是:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin 2. 将目录更改为此目录,即 cd/usr/lib/jvm/java-8-openjdk-amd64/jre/bin 3. 更改其功能: sudo setcap cap_net_raw,cap_net_admin=EIP Java

这修复了从脚本调用我的 Java 应用程序时的权限问题。但是,从 Netbeans 中运行它仍然会产生权限错误。 这是因为 Netbeans 使用的 Java 版本不一定与 bash 脚本使用的 Java 版本相同。在我的案例中,Netbeans 使用的是版本 11,因此将版本 8 添加到可用平台,然后将项目切换到此平台。

最新更新