Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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 检查用户名:getpwnam/getpwnam_r:没有这样的文件或目录_C_Linux_Passwords - Fatal编程技术网

C 检查用户名:getpwnam/getpwnam_r:没有这样的文件或目录

C 检查用户名:getpwnam/getpwnam_r:没有这样的文件或目录,c,linux,passwords,C,Linux,Passwords,我正在尝试进行web日志记录,并使用getpwnam()函数检查用户名是否存在。但是对于有效用户名getpwnam返回错误:没有这样的文件或目录。因此我尝试了getpwnam_r(),但也失败了,出现了相同的错误。我在嵌入式arm linux上运行,我使用/etc/passwd存储密码(我没有/etc/shadow)。我的测试计划是: #include <pwd.h> #include <stdio.h> #include <stdlib.h> #includ

我正在尝试进行web日志记录,并使用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权限运行我的程序(测试),但当我给它一个现有用户名时,它也失败了

/ # /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
~ #
提前谢谢!Bakir

1)密码数据库(/etc/passwd)中使用的搜索服务或方法在/etc/nsswitch.conf中定义。要使用此服务,函数调用lib目录中的共享库:/lib/libnss_service.so.x,其中service是搜索方法。在我的例子中,compat是默认方法,因为没有/etc/nsswitch.conf。因此,我需要将libnss\u compat.So.2添加到/lib

战略是有用的东西


非常感谢osqxalk

不会为
enoint
打印此类文件或目录,如果给定的
名称不存在,可能会返回该文件或目录。那么你确定要用一个有效的帐户名来测试它吗?是的,我确定。我甚至用adduser命令添加了新用户,但得到了相同的结果。也许我需要更改或在/etc目录中添加一些其他文件?我的密码文件是:~#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~#您实际使用的是什么
bufsize
?您可能希望将其打印出来。My bufsize=1024字节。您可以为您的程序运行strace(
strace/tmp/test
),以查看发生了什么和失败了什么。
~ # 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
~ #