2

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 だけが書き込めます:

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

また、ルート権限でプログラム ( test ) を実行しようとしましたが、既存のユーザー名を指定したときにも失敗しました。

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

1) それで、私は何を忘れましたか、または追加で何をすべきですか?

2)システムユーザーのパスワードを保存するために/etc/shadowファイルを使用する必要がありますか?


アップデート:

私のpasswdファイルは次のとおりです。

~ # 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
~ #

前もって感謝します!バキール

4

1 に答える 1

1

1)パスワード データベース ( /etc/passwd ) で使用される検索サービスまたは方法は、 /etc/nsswitch.confで定義されます。このサービスを使用するには、 getpwnam関数が lib ディレクトリの共有ライブラリを呼び出します: /lib/libnss_SERVICE.so.x。ここで、SERVICE は検索メソッドです。私の場合、 /etc/nsswitch.confがないため、 compatがデフォルトの方法です。そのため、libnss_compat.so.2 を /lib に追加する必要がありました。

straceは便利なものです!

osqxalkに感謝します。

于 2013-05-22T10:34:14.183 に答える