Вы не можете создать 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;