Во встроенной системе (ядро 2.4) мне нужен доступ к необработанному сокету к интерфейсу eth0 из процесса , а не , работающего от имени пользователя root.
Я попытался решить эту проблему, установив возможность CAP_NET_RAW из командной строки и программно используя cap_set_proc (), но оба безуспешно. Кажется, у меня нет разрешения на это, в программе я получаю ошибку EPERM, в командной строке
Не удалось установить ограничение на процесс `1586 ': (операция не разрешена)
Есть ли более простой способ сделать то, что я хочу? Если нет, какие шаги необходимы для успешной установки возможности CAP_NET_RAW?
РЕДАКТИРОВАТЬ: У меня есть доступ с правами root, но запуск процесса на постоянной основе от имени root не вариант. Версия libcap - 1.10, двоичного файла setcap нет, но есть setpcaps.
РЕДАКТИРОВАТЬ - отвечая Георгию Скопцову:
Если я вас правильно понял, вы предлагаете запустить процесс с помощью setuid, затем установить возможность CAP_NET_RAW и затем отбросить привилегии. Я попробовал это с помощью следующего кода, но, похоже, он не работает, хотя команда caps не возвращает ошибок. С закомментированным seteuid (), raw доступ работает, но только если процесс запущен от имени пользователя root:
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
Спасибо за вашу помощь.
Chris