Respostas:
man
(o comando, não o usuário) é um aplicativo de ajuda. Os aplicativos fornecem páginas de manual em seus pacotes, mas man
precisam saber onde eles estão e também que ajuda eles fornecem. Para acelerar as coisas - portanto, man
não é procurar o sistema de arquivos inteiro quando você digita man <command>
- essas páginas de manual 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 do idioma no mesmo diretório). Este é um banco de dados de hash de valor-chave que não é diferente do memcache ou de centenas de outras implementações em idéias semelhantes. É binário, leve e rápido. Vou dar um exemplo de como jogar com ele no final.
Esta indexação está programada para ser executada diariamente no Ubuntu por /etc/cron.daily/man-db
. Todo o script é executado como root e faz algumas limpezas primeiro, mas logo no final vemos mandb
como sendo executados man
:
# --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 propriedades do grupo /var/cache/man
ainda são raiz.
Mas por que é mandb
executado como um usuário diferente? Poderia (provavelmente) funcionar tão bem quanto, root
mas está processando entradas de várias fontes (veja manpath
). A execução como seu próprio usuário isola o sistema do processo que está explodindo - ou pior -, sendo explorado por páginas de manual malformadas, corrompidas ou mal-intencionadas.
O pior que poderia acontecer afetaria apenas o man
índice de páginas. 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 um usuário poderia 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 exposto, na verdade existem campos separados por tabulações:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Você pode ler mais sobre o conteúdo real do campo no manual técnico .