Eu tenho um pacote que gosto de construir localmente. Alguns dos arquivos do pacote devem ser instalados em um sistema onde um determinado usuário é criado primeiro. Esses arquivos devem pertencer a esse usuário.
Por exemplo, digamos que eu tenha um usuário "foo" em meu servidor e crie um pacote com um arquivo que /usr/share/foo/protected.file
tenha permissões u=r
(ou seja, somente esse usuário pode ler esse arquivo).
O que eu gostaria de fazer no meu debian/rules
arquivo é configurá-lo assim:
override_dh_fixperms:
dh_fixperms
...
chmod 400 debian/foo/usr/share/foo/protected.file
chown foo:foo debian/foo/usr/share/foo/protected.file
...
Meu problema é que o computador que uso para construir o pacote não possui um usuário chamado "foo", então isso chown
falha. Eu gostaria de não criar um usuário “foo” nesse computador.
Existe uma maneira de fazer isso no processo de construção (ou seja, eu sei que poderia hackear o arquivo .tar resultante, mas não quero fazer isso).
Eu uso o seguinte comando para executar minha compilação local:
dpkg-buildpackage -us -uc
Tecnicamente , você pode construir seu pacote da maneira que desejar. No que
.deb
diz respeito aos arquivos, tudo o que se espera no estágio final da construção do pacote édebian/rules binary
deixar um arquivo válido.deb
com o nome correto no diretório pai. Portanto, você pode substituirdh_builddeb
a criação do tarball por arquivos de propriedade de um usuário inexistente.No entanto, os pacotes Debian que envolvem usuários não-padrão não fazem isso: eles lidam com a propriedade de arquivos em seus arquivos
postinst
. Eles geralmente também cuidam da criação de usuários lá: se o usuário não existir, eles o criam antes de executar ochown
. Isso garante que o pacote possa ser instalado independentemente dos usuários pré-existentes.A condição de corrida mencionada em um comentário não deve importar na prática: se
dpkg -i
for bem-sucedida, o arquivo terá a propriedade correta antes dedpkg -i
ser concluído; se falhar, o pacote deverá ser considerado inutilizável de qualquer maneira.Quando você
chown
não está alterando o proprietário para um nome, você está alterando-o para um número (o UID para o qual o nome está mapeado).Você pode exigir que o usuário seja criado com um UID (e GID) específico no sistema de destino e alterar seu comando para usar esses números; por exemplo