Мне нужно написать функцию ping для работы в Linux. Язык - C++, поэтому C тоже отлично.Открытие RAW-сокетов в Linux без суперпользователя
Поиск в Интернете и смотреть на исходный код для команды ping
, то получается, что я должен создать сокеты:
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
Если я запускаю мое приложение, не будучи суперпользователем, то socket
функция возвращает -1
т. Е. Сокет не создан успешно. Если я запускаю его как суперпользователя, все работает нормально.
Теперь команда ping
создала сырой сокет, и я могу запустить его без прав суперпользователя.
Мой вопрос: как я могу предоставить моему приложению все разрешения, необходимые для создания сырого сокета без выполнения суперпользователем?
Спасибо, это сработало! Но, если я попытаюсь отладить его в Eclipse, функция сокета снова вернет -1. Я попытался установить возможности cap_new_raw как для eclipse, так и для gdb, но это не сработает. –
Ах. Да, отладка программ с возможностями (или с установленным битом suid) является проблемой, потому что предоставление непривилегированному пользователю «ptrace» будет довольно большой дырой в безопасности. Возможно, вы можете настроить eclipse для запуска gdb с помощью sudo, что позволит вам отлаживать приложение, погружая голову в кошмар безопасности, предоставляя непривилегированному пользователю возможность запускать suid debugger. Я не думаю, что есть идеальное решение этой проблемы. – Wintermute
Хорошо, я попробую. Благодарю. –