简短版本:我想要一种运行方式somefunction("username")并让它返回与之关联的用户ID username.例如somefunction("root")会返回0.
我正在编写一个可能使用低编号端口的服务器程序,所以它必须以root身份启动.显然,我不希望它以root身份运行,因此计划是让用户指定程序应该运行的用户.问题是setuid()需要用户ID,我不知道如何从登录名中查找用户ID.我查了一下,unistd.h它似乎只有查找当前用户信息的功能.
我知道我可以打开/etc/passwd,但是当我必须要有这个功能时我宁愿不要.
Mat*_*ner 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]));
}
Run Code Online (Sandbox Code Playgroud)
小智 7
一种更简单的方法是:
#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;
}
Run Code Online (Sandbox Code Playgroud)