Qual comando (disponível em repositórios de distribuição) devo usar para iniciar um shell com uid, gid e grupos numéricos especificados? Normalmente su
é usado para mudar de root para outro usuário, mas tenta procurar grupos por nomes, que podem não existir quando sistemas de arquivos externos, namespaces e contêineres do Docker estão em uso.
Espero que seja um aplicativo simples que apenas faça setgroups(2)
, e setgid(2)
, sem qualquer ou nsswitch. É fácil implementar esse programa em C, mas talvez algo padrão e disponível para distribuição seja usado para este caso de uso?setuid(2)
execve(2)
/etc/passwd
Como uma alternativa:
setpriv
Limpo e simples
chroot
Chroot tem uma opção
--userspec
e--groups
normalmente está disponível em distros. Definir o diretório de destino para/
renderizar o objetivo principal do chroot nil, mas o efeito de substituição de uid/gid/groups ainda está em vigor.Se você tem Perl e se preocupa apenas com os UIDs e GIDs, é relativamente simples fazer isso:
$(
e$)
são o GID real e efetivo; e$<
e$>
o UID real e efetivo (nesta ordem).$)
pode receber uma string representando vários números, também definirá os grupos suplementares. (Para limpar a lista desses, defina o GID primário duas vezes, por exemplo$) = "456 456"
)Ou, em
English
:Você também pode usar
POSIX::set[gu]uid()
e é claro que você deve verificar$!
após as modificações nas variáveis especiais para verificar se há erros. O acima falharia silenciosamente se você não tivesse os direitos para alterar seus grupos ou UID.