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
短,并且具有相当大的正确性。