Мне нужно создать master.passwd с данными spwd.db и pwd.db, как это можно сделать с помощью pwd_mkdb -p . Однако мне нужно указать как входные, так и выходные пути.

Итак, учитывая somesuch/spwd.db и somesuch/pwd.db , я хочу создать somesuch/master.passwd .

Я наивно пробовал что-то вроде pwd_mkdb -p -d somesuch/ somesuch/spwd.db безуспешно ("Неподходящий тип или формат файла").

1 ответ1

2

Вы не можете создать master.passwd из spwd.db с помощью pwd_mkdb. Опция -p генерирует только файл /etc/passwd , который не содержит хэши паролей!

Правильная процедура - восстановить master.passwd из ваших резервных копий. Если у вас их нет, это хороший пример того, почему у вас должны быть резервные копии всех ваших данных конфигурации!

Проверьте /var/backups backups на наличие резервных копий master.passwd .

Если резервные копии не найдены, вам придется восстановить master.passwd из содержимого spwd.db Файлы /etc/pwd.db и /etc/spwd.db являются файлами базы данных Berkeley:

file /etc/pwd.db
/etc/pwd.db: Berkeley DB 1.85 (Hash, version 2, native byte-order)

Если вы хотите прочитать эти базы данных, вы можете, например, использовать программу db4_dump185 из /usr/ports/databases/db4 .

При чтении файлов таким способом обратите внимание на следующую информацию из исходного кода из /usr/src/usr.sbin/pwd_mkdb/pwd_mkdb.c:

    /*
     * The databases actually contain three copies of the original data.
     * Each password file entry is converted into a rough approximation
     * of a ``struct passwd'', with the strings placed inline.  This
     * object is then stored as the data for three separate keys.  The
     * first key * is the pw_name field prepended by the _PW_KEYBYNAME
     * character.  The second key is the pw_uid field prepended by the
     * _PW_KEYBYUID character.  The third key is the line number in the
     * original file prepended by the _PW_KEYBYNUM character.  (The special
     * characters are prepended to ensure that the keys do not collide.)
     */

Прочитайте вышеупомянутый исходный код, чтобы увидеть, как строки хранятся в хешированной базе данных:

#define COMPACT(e)      t = e; while ((*p++ = *t++));
#define SCALAR(e)       store = htonl((uint32_t)(e));      \
                        memmove(p, &store, sizeof(store)); \
                        p += sizeof(store);
#define LSCALAR(e)      store = HTOL((uint32_t)(e));       \
                        memmove(p, &store, sizeof(store)); \
                        p += sizeof(store);
#define HTOL(e)         (openinfo.lorder == BYTE_ORDER ? \
                        (uint32_t)(e) : \
                        bswap32((uint32_t)(e)))

а также

                    /* Create secure data. */
                    p = sbuf;
                    COMPACT(pwd.pw_name);
                    COMPACT(pwd.pw_passwd);
                    SCALAR(pwd.pw_uid);
                    SCALAR(pwd.pw_gid);
                    SCALAR(pwd.pw_change);
                    COMPACT(pwd.pw_class);
                    COMPACT(pwd.pw_gecos);
                    COMPACT(pwd.pw_dir);
                    COMPACT(pwd.pw_shell);
                    SCALAR(pwd.pw_expire);
                    SCALAR(pwd.pw_fields);
                    sdata.size = p - sbuf;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .