Você não pode produzir master.passwd
de spwd.db
com pwd_mkdb.
A opção -p
gera apenas um arquivo /etc/passwd
, o que não contém os hashes de senha!
O procedimento adequado é restaurar master.passwd
de seus backups. Se você não possui, este é um bom exemplo do porquê você deve ter backups de todos os seus dados de configuração!
Verifique /var/backups
para cópias de backup de master.passwd
.
Se não houver backups, você terá que reconstituir master.passwd
do conteúdo de spwd.db
. Os arquivos /etc/pwd.db
e /etc/spwd.db
são arquivos do banco de dados Berkeley:
file /etc/pwd.db
/etc/pwd.db: Berkeley DB 1.85 (Hash, version 2, native byte-order)
Se você quiser ler esses bancos de dados, você pode, por exemplo use o programa db4_dump185
de /usr/ports/databases/db4
.
Ao ler os arquivos dessa maneira, observe as seguintes informações do código fonte de /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.)
*/
Leia o código-fonte acima mencionado para ver como as linhas são armazenadas no banco de dados com hash:
#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)))
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;