Поскольку бит suid
в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не реальный UID (RUID), который возвращает getuid()
, и в дополнение к интерпретируемому ограничению suid
сценарии (любой исполняемый файл, начинающийся с "#!
"), некоторые оболочки, например bash
, в качестве дополнительной меры безопасности вернут EUID обратно к RUID, в этом случае вам нужно будет использовать вызов setuid(0)
в коде C перед выполнением сценария.
См. man
страницы setuid
, seteuid
, getuid
и geteuid
, чтобы узнать точную семантику действительных и эффективных UID.
( ПРЕДУПРЕЖДЕНИЕ ) Конечно, уместно упомянуть, что ограничение на скрипты suid
во многих системах Unix, оболочках и интерпретаторах существует по причине, которая заключается в том, что если Скрипт не очень осторожен в отношении очистки входных данных и состояния среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Так что будьте очень осторожны при этом. Установите как можно более строгий доступ к вашему сценарию и оболочке, разрешите только этот весьма специфический сценарий, который вы собираетесь выполнять, и очистите среду в вашей программе на C перед запуском сценария, установив переменные среды, такие как PATH
, для хранения именно то, что необходимо в правильном порядке и нет каталогов, которые могут быть записаны для других.