man
(o comando, não o usuário) é um aplicativo de ajuda. Os aplicativos fornecem páginas man em seus pacotes, mas man
precisa saber onde eles estão e também que ajuda eles fornecem. Para acelerar as coisas - então man
não é pesquisar o sistema de arquivos inteiro quando você digita man <command>
- essas páginas man são indexadas em um banco de dados por um comando chamado mandb
.
No Ubuntu mandb
armazena índices em um banco de dados GNU gdbm em /var/cache/man/index.db
(e algumas versões específicas de idioma no mesmo diretório). Este é um banco de dados hash de valor-chave não muito diferente do memcache, ou de centenas de outras implementações de idéias semelhantes. É binário, leve e rápido. Vou dar um exemplo de como brincar com isso no final.
Esta indexação está agendada para ser executada diariamente no Ubuntu por /etc/cron.daily/man-db
. O script inteiro é executado como root e faz algumas limpezas primeiro, mas no final vemos mandb
sendo executado como o man
user:
# --pidfile /dev/null so it always starts; mandb isn't really a daemon,
# but we want to start it like one.
start-stop-daemon --start --pidfile /dev/null \
--startas /usr/bin/mandb --oknodo --chuid man \
$iosched_idle \
-- --no-purge --quiet
Não está mudando de grupo, e é por isso que todas as posses do grupo em /var/cache/man
ainda são raiz.
Mas por que mandb
é executado como um usuário diferente? Ele pode (provavelmente) ser executado como root
, mas é processamento de entrada de um variedade de fontes (veja em manpath
). A execução como seu próprio usuário isola o sistema do processo explodindo - ou pior - sendo explorado por páginas do manual mal-intencionadas, corrompidas ou maliciosas.
O pior que poderia acontecer afetaria apenas o índice man
pages. Boo hoo. Você pode confirmar isso com algo como:
sudo -u man find / -writable 2>/dev/null
E você pode usar essa abordagem para ver quanto dano qualquer usuário pode causar em um sistema. É uma boa ideia auditar suas permissões de arquivo (acabei de descobrir que qualquer usuário pode excluir toda a minha coleção de músicas, por exemplo).
Você pode espiar o banco de dados com accessdb
. Aqui estão alguns registros aleatórios:
$ accessdb | shuf -n3
fpurge -> "- 3 3 1380819168 A - - gz purge a stream"
fcgetlangs -> "FcGetLangs 3 3 1402007131 A - - gz Get list of languages"
ipython -> "- 1 1 1393443907 A - - gz Tools for Interactive Computing in Python."
Embora não esteja totalmente claro a partir do acima, há campos separados por tabulações lá:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Você pode ler mais sobre o conteúdo real do campo no manual técnico .