如何在Linux上获取与登录相关联的用户标识?

时间:2010-10-01 03:29:31

标签: c unix

简短版本:我想要一种运行somefunction("username")的方法,并让它返回与username相关联的用户ID。例如,somefunction("root")会返回0

我正在编写一个可能使用低编号端口的服务器程序,因此它必须以root身份启动。显然,我不希望它以root身份运行,因此计划是让用户指定程序应该运行的用户。问题是setuid()需要用户ID,我不知道如何从登录名中查找用户ID。我查看了unistd.h,它似乎只有查找当前用户信息的功能。

我知道我可以打开/etc/passwd,但是当我必须有一个函数时,我宁愿不这样做。

2 个答案:

答案 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;
}