Чтобы изменить текущий идентификатор пользователя:
Сначала найдите новый идентификатор пользователя, используя getpwnam()
.Это возвращает struct passwd *pw
, и значение NULL будет указывать, что пользователь не выходит.struct
содержит идентификатор пользователя (pw_uid
) и идентификатор группы (pw_gid
), необходимые для выполнения изменения.
if((pw = getpwnam(userid)) == NULL)
sprintf(error_msg "Userid '%s' does not exist", userid);
Затем установите идентификатор группы дляновый пользователь
if (setgid(pw->pw_gid) != 0)
sprintf(error_msg "setgid() to %d failed", pw->pw_gid);
Наконец, установите идентификатор пользователя для нового пользователя
if (setuid(pw->pw_uid) != 0)
sprintf(error_msg "setuid() to %d failed", pw->pw_uid);
Ошибка восстановления во время этого процесса грязная,Самый простой способ - просто прервать работу, если произойдет сбой setgid()
или setuid()
.Настоящая проблема возникает, если смена группы прошла успешно, но смена пользователя не удалась.