简短版本:我想要一种运行somefunction("username")
的方法,并让它返回与username
相关联的用户ID。例如,somefunction("root")
会返回0
。
我正在编写一个可能使用低编号端口的服务器程序,因此它必须以root身份启动。显然,我不希望它以root身份运行,因此计划是让用户指定程序应该运行的用户。问题是setuid()
需要用户ID,我不知道如何从登录名中查找用户ID。我查看了unistd.h
,它似乎只有查找当前用户信息的功能。
我知道我可以打开/etc/passwd
,但是当我必须有一个函数时,我宁愿不这样做。
答案 0 :(得分:15)
你想要getpwnam
。
这是我刚才写的一个完整的例子:
#define _POSIX_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <pwd.h>
#include <unistd.h>
uid_t name_to_uid(char const *name)
{
if (!name)
return -1;
long const buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
if (buflen == -1)
return -1;
// requires c99
char buf[buflen];
struct passwd pwbuf, *pwbufp;
if (0 != getpwnam_r(name, &pwbuf, buf, buflen, &pwbufp)
|| !pwbufp)
return -1;
return pwbufp->pw_uid;
}
void main(int argc, char **argv)
{
printf("%i\n", name_to_uid(argv[1]));
}
答案 1 :(得分:6)
更简单的方法是:
#include <pwd.h>
#define INVALID_UID -1
uid_t getuid_byName(const char *name)
{
if(name) {
struct passwd *pwd = getpwnam(name); /* don't free, see getpwnam() for details */
if(pwd) return pwd->pw_uid;
}
return INVALID_UID;
}