Тарантино пишет: |
На линуксах сейчас уже не так, там значительно более сложная система прав. Вместо просто 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.