我正在编写一个使用 Pcap 库进行数据包嗅探的应用程序。为了让它发挥作用,我需要给出java
二进制网络嗅探功能,以避免必须将其运行为root
:
sudo setcap cap_net_raw,cap_net_admin=eip /path/to/bin/java
当我运行任何程序时,每隔几秒钟,我就会得到一个完整线程转储到stdout
. Here https://gitlab.com/Alfred456654/test-pcap/-/raw/master/bad_output.txt是此类完整线程转储的一个示例(存储库的其余部分不相关)。否则该程序似乎运行成功:除了转储之外,我找不到执行中的差异。
下面的代码足以重现该问题:
package main;
import java.io.IOException;
public class StdinTest {
public static void main(String[] args) throws IOException {
System.in.read();
}
}
当我从java
使用下面的命令运行二进制文件,一切都会恢复正常,并且我不再将完整线程转储到标准输出。
sudo setcap -r /path/to/bin/java
我不确定这是一个问题,因为程序似乎运行良好,但看起来并不normal.
我没有找到任何人似乎有类似的问题,我有点迷失......
感谢任何帮助,提前致谢!
Details:
- 操作系统:在ArchLinux(内核5.12.9)和Ubuntu 20.04(内核5.8.0)上复制
- JDK:在 Adopt OpenJDK 11、15 和 16、openjdk.java.net 15 和 16 上复制。
EDIT:
如果程序在命令行中运行,则无法重现:
java -classpath target/classes main.StdinTest
我仅在从 IntelliJ Idea Ultimate 启动时才会出现症状。我还没有尝试过其他 IDE。