Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在Linux上获取与登录相关联的用户id?_C_Unix - Fatal编程技术网

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

C 如何在Linux上获取与登录相关联的用户id?,c,unix,C,Unix,简短版本:我想要一种运行somefunction(“用户名”)并让它返回与username关联的用户ID的方法。例如somefunction(“root”)将返回0 我正在编写一个服务器程序,它可能会使用低编号的端口,因此它必须以root用户身份启动。显然,我不希望它以root用户的身份运行,所以计划是让用户指定程序应该以哪个用户的身份运行。问题是setuid()需要用户ID,我不知道如何从登录名中查找用户ID。我查看了unistd.h,它似乎只有查找当前用户信息的功能 我知道我可以直接打开/e

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

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

我知道我可以直接打开
/etc/passwd
,但我不希望在绑定了函数的情况下打开它。

你想要的

这是我刚刚写的一个完整的例子:

#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]));
}
#定义POSIX_SOURCE
#包括
#包括
#包括
#包括
uid\u t name\u to\u uid(字符常量*名称)
{
如果(!name)
返回-1;
long const buflen=sysconf(_SC_GETPW_R_SIZE_MAX);
如果(buflen==-1)
返回-1;
//需要c99
char-buf[buflen];
结构passwd pwbuf,*pwbufp;
如果(0!=getpwnam_r(名称和pwbuf、buf、buflen和pwbufp)
||!pwbufp)
返回-1;
返回pwbufp->pw\u uid;
}
void main(整型argc,字符**argv)
{
printf(“%i\n”,名称到uid(argv[1]);
}

更简单的方法是:

#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;
}
#包括
#定义无效的UID-1
uid\u t getuid\u byName(常量字符*名称)
{
如果(姓名){
struct passwd*pwd=getpwnam(name);/*不释放,请参阅getpwnam()了解详细信息*/
如果(pwd)返回pwd->pw\u uid;
}
返回无效的UID;
}

答案给了你一条鱼;这里是钓鱼的方法:
man-k-s3密码
man-man
,以防你不知道第一个命令的意思。可能的重复看起来正是我需要的。非常感谢
void main
错误;它应该是
int main
。在访问
argv[1]
@KeithThompson之前,您应该检查
argc
的值:这是一个简短的示例。name to uid函数之外的边界检查和错误处理超出了答案的范围。
int main
void main
短,并且具有相当大的正确性。