【问题标题】:Pcap4j Library: Exception in thread "main" java.io.IOException: No NIF to capturePcap4j 库:线程“主”java.io.IOException 中的异常:没有要捕获的 NIF
【发布时间】:2018-03-16 10:42:52
【问题描述】:

当我捕获数据包时,我收到以下错误:

线程“main”java.io.IOException 中的异常:没有要捕获的 NIF。

    at org.pcap4j.util.NifSelector.selectNetworkInterface(NifSelector.java:44)

    at io.bigdatalabs.pcaptest.App.main(App.java:22)

代码是:

  package io.bigdatalabs.pcaptest;

import java.io.IOException;
import org.pcap4j.core.BpfProgram.BpfCompileMode;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.PcapNetworkInterface.PromiscuousMode;
import org.pcap4j.packet.Packet;
import org.pcap4j.util.NifSelector;

public class App {

    public static void main(String [] args) throws PcapNativeException, IOException, NotOpenException, InterruptedException {
        String filter = null;
        if (args.length != 0) {
            filter = args[0];
        }

        PcapNetworkInterface nif = new NifSelector().selectNetworkInterface();
        if (nif == null) {
            System.exit(1);
        }

        final PcapHandle handle = nif.openLive(65536, PromiscuousMode.PROMISCUOUS, 10);

        if (filter != null && filter.length() != 0) {
            handle.setFilter(filter, BpfCompileMode.OPTIMIZE);
        }

        PacketListener listener = new PacketListener() {
            @Override
            public void gotPacket(Packet packet) {
                printPacket(packet, handle);
            }
        };

        handle.loop(5, listener);
    }

    private static void printPacket(Packet packet, PcapHandle ph) {
        StringBuilder sb = new StringBuilder();
        sb.append("A packet captured at ")
                .append(ph.getTimestamp())
                .append(":");
        System.out.println(sb);
        System.out.println(packet);
    }

}

但是我用 sudo 命令运行这段代码,它正在运行。为什么我不运行没有 sudo 的代码?我应该在没有 sudo 的情况下运行此代码。如何运行此代码?

【问题讨论】:

  • 因为你/普通用户没有抓包权限。

标签: java linux capture


【解决方案1】:

为了列出和监控您的网络接口,您需要超级用户权限。这就是为什么在没有 sudo 的情况下运行此代码时无法列出任何接口并获得异常的原因。

如果您不使用 sudo 不运行它,即使是著名的 WireShark 也无法列出您的接口,所以我认为没有其他解决方案可以让您以正常权限运行您的应用程序。

祝你好运。

【讨论】:

  • 是否可以在没有超级用户的情况下监听端口?我认为,可以在没有 sudo 的情况下实现端口监听。这两种情况有什么区别?
  • 在安全方面,监听端口和监控接口下所有传入 - 传出包之间存在很大差异。
  • 感谢您的关注。
猜你喜欢
  • 2021-08-30
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2023-03-18
  • 2012-10-16
相关资源
最近更新 更多