Вероятно, оболочка по той или иной причине меняет свой эффективный идентификатор пользователя обратно на реальный идентификатор пользователя в процессе запуска. Вы можете проверить это, добавив:
/* needs _GNU_SOURCE; non-Linux users see setregid/setreuid instead */
uid_t euid = geteuid(), egid = getegid();
setresgid(egid, egid, egid);
setresuid(euid, euid, euid);
перед вашим system()
. (На самом деле, даже в Linux вам, вероятно, нужно установить только настоящие; сохраненные должны быть в порядке, чтобы оставить в покое. Это просто грубая сила для отладки. В зависимости от того, почему вы установили идентификатор -, вам, конечно, может понадобиться где-то сохранить настоящие идентификаторы.)
[Кроме того, если это не просто упражнение по изучению того, как работает setid, то существует множество проблем безопасности, о которых нужно беспокоиться, особенно при вызове оболочки. Например, существует множество переменных среды, влияющих на поведение оболочки. Предпочитайте уже -существующий подход, такой как sudo
, если это вообще возможно.]