Tulup.ru - Клуб любителей фигурного катания

К админам!

Автор
Сообщение
bregalad
Сообщений: 11726
Москва
29.06.2023, 10:59
К админам!
Тарантино пишет:
На линуксах сейчас уже не так, там значительно более сложная система прав. Вместо просто root-пользователя и setuid флагов, там есть такое понятие, как capabilities. Это специальные права на какие-то действия, которые можно выставить как на процесс, так и на исполняемый файл, по аналогии с setuid. Десятки этих capability существует. В линуксах для этого есть утилиты setcap/getcap, для примера можно запустить команду, посмотреть специальные права, если они есть
> getcap /bin/ping
/bin/ping cap_net_raw=ep

Я в свое время писал сетевой монитор (графический на Qt), заодно нужно было самому написать функцию ping, чтобы вставить ее в проект (не используя системную утилиту ping). Точно всё уже не помню, там используется протокол ICMP, почему-то открытие сокета как дейтаграммного не проходило, а для открытия RAW-сокета необходимы привелегии:

    //??? if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0)
    if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
    {
        if (print)
            cerr << "Needs to run as superuser!" << endl;
        return -1; /* Needs to run as superuser! */
    }


Но бит s, слава богу, не нужен, вот Makefile маленькой тестовой программы:

CC = g++ $(CFAGS)
CFLAGS =

pingmon: pingmon.cpp Ping.h Ping.o
        $(CC) -o pingmon pingmon.cpp Ping.o
        @setcap cap_net_raw+ep pingmon; \
        if [ "$$?" -ne "0" ]; then \
            rm -f pingmon; \
            echo "Use the \"sudo make\" command!"; \
        fi;

Ping.o: Ping.cpp Ping.h
        $(CC) -c Ping.cpp

clean:
        rm -f *.o pingmon


Команда Linux'а, выделенная красным, дает программе необходимые привилегии без использования бита s.
Вход


Имя
Пароль
 
Поиск по сайту
Найти пользователя
Найти

© Tulup 2005–2025
Время подготовки страницы: 0.017 сек.