gpt4 book ai didi

检查用户名 : getpwnam/getpwnam_r: No such file or directory

转载 作者:太空狗 更新时间:2023-10-29 12:34:08 29 4
gpt4 key购买 nike

我正在尝试进行网络日志记录,并使用 getpwnam() 函数来检查现有的用户名。但是对于有效的用户名,getpwnam 返回错误:没有这样的文件或目录。所以我尝试了 getpwnam_r(),但它也因同样的错误而失败。我在嵌入式 arm linux 上运行,我使用 /etc/passwd 来存储密码(我没有 /etc/shadow)。我的测试程序是:

#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int
main(int argc, char *argv[])
{
struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;

if (argc != 2) {
fprintf(stderr, "Usage: %s username\n", argv[0]);
exit(EXIT_FAILURE);
}

bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1) /* Value was indeterminate */
bufsize = 16384; /* Should be more than enough */

buf = malloc(bufsize);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}

s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
if (result == NULL) {
if (s == 0)
printf("Not found\n");
else {
errno = s;
perror("getpwnam_r");
}
exit(EXIT_FAILURE);
}

printf("Name: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);
exit(EXIT_SUCCESS);
}

密码文件只能由root写入:

/ # ls -l /etc/passwd
-rw-r--r-- 1 root root 207 Jan 1 00:29 /etc/passwd
/ #

我还尝试使用 root 权限运行我的程序(测试),但是当我给它一个现有的用户名时它也失败了。

/ # /tmp/test admin
getpwnam_r: No such file or directory
/ #

1) 那么,我忘记了什么,或者还应该做什么?

2) 我是否需要使用/etc/shadow 文件来存储系统用户的密码?


更新:

我的密码文件是:

~ # cat /etc/passwd 
root:b6MVch7fPLasN:0:0:root:/home/root:/bin/ash
admin:8Mt/Jtxcyg8AY:1000:1000:admin:/tmp:/tmp/cli
user:5v4HoPrA9NtUo:1001:1000:user:/tmp:/tmp/cli
~ #

提前致谢!巴克尔

最佳答案

1)密码数据库(/etc/passwd)中使用的搜索服务或方法定义在/etc/nsswitch.conf。要使用此服务getpwnam 函数调用lib 目录中的共享库:/lib/libnss_SERVICE.so.x,其中SERVICE 是搜索方法。在我的例子中,compat 是默认方法,因为缺少 /etc/nsswitch.conf。所以,我需要将 libnss_compat.so.2 添加到/lib。

strace 很有用!

非常感谢 osqxalk!

关于检查用户名 : getpwnam/getpwnam_r: No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666587/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com