Библиотека Pcap4j: исключение в потоке «main» java.io.IOException: нет NIF для захвата

Когда я захватываю пакеты, я получаю следующую ошибку:

Exception in thread "main" java.io.IOException: No NIF to capture.

    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. Как мне запустить этот код?

Потому что у вас / обычного пользователя нет разрешений на перехват пакетов.

Aniket Sahrawat 16.03.2018 11:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
597
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для того, чтобы составлять список и контролировать ваши сетевые интерфейсы, вам необходимы привилегии суперпользователя. Вот почему вы не можете перечислить какие-либо интерфейсы и получить исключение при запуске этого кода без sudo.

Даже знаменитый WireShark не может перечислить ваши интерфейсы, если вы не запустите его без sudo, поэтому я не думаю, что у вас будут какие-либо другие решения для запуска вашего приложения с обычными привилегиями.

Удачи.

Можно ли слушать порт без суперпользователя? Думаю, можно реализовать прослушивание портов без sudo. В чем разница между этими двумя ситуациями?

Şeyma Alaca 16.03.2018 14:05

С точки зрения безопасности, существует большая разница между прослушиванием порта и мониторингом всех входящих-исходящих пакетов через интерфейс.

Emre Acar 16.03.2018 14:13

Спасибо за интерес.

Şeyma Alaca 16.03.2018 14:23

Другие вопросы по теме