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

Rei*_*ica 8 c unix

简短版本:我想要一种运行方式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)