Existe um mecanismo padronizado no Linux que pode ser usado para vincular nomes de usuários a IDs de usuário sem realmente criar uma conta do sistema que possa efetuar login?
Parece que algo assim é possível, uma vez que existe a capacidade de se conectar a um servidor Windows e fornecer UIDs aos usuários. Geralmente em um intervalo alto de números.
O que eu preciso / quero isso é ser capaz de atribuir nomes significativos a grupos e usuários que só existem como IDs subordinados ( userns ).
Eu acho que isso poderia ser feito com algo relacionado a nss (5) mas veio de mãos vazias.
Nosistemahost,geralmente,UIDs(eGIDs)de64kestãoemuso,mas0..2^32-1
éointervalodeIDsdeusuáriodisponíveis.Assim,podemosatribuirsub-intervalosdesseintervalogeralcomoIDssubordinadosparadeterminadosusuários.Porexemplo.poderíamosdizerqueointervalo100000..2^32-1
éatribuídoaousuárioroot
nonamespaceraiz.
EmtermosdeLXC(100000..165535
dentro do namespace filho seja exibido como 0..65535
.
Consequentemente, os arquivos pertencentes a root
dentro do namespace filho aparecerão como pertencentes ao UID 100000 no host .
Portanto, seria útil se eu pudesse atribuir um nome significativo a este "virtual" UID 100000 no sistema host sem realmente ter que criar uma conta de usuário.
É isso que estou procurando.
Agora, estou usando este script auxiliar como solução alternativa. Sinta-se à vontade para usá-lo nos termos prescritos pelos termos StackExchange ou Public Domain / CC0:
#!/usr/bin/env bash
LXCPATH=$(lxc-config lxc.lxcpath)
function create-group
{
local NAME=$1
local GUEST=$3
local GUESTCONF="/etc/lxc/guests/lxc.$GUEST.conf"
local BASEID=$(awk '$1 ~ /^lxc\.id_map$/ && $3 ~ /^g$/ {print $5}' "$GUESTCONF" || echo "0")
local ID=$(($2+$BASEID))
echo "groupadd -g $ID $NAME"
}
function create-user
{
local NAME=$1
local GUEST=$3
local GUESTCONF="/etc/lxc/guests/lxc.$GUEST.conf"
local BASEID=$(awk '$1 ~ /^lxc\.id_map$/ && $3 ~ /^u$/ {print $5}' "$GUESTCONF" || echo "0")
local ID=$(($2+$BASEID))
echo "useradd -M -N -u $ID -s /usr/sbin/nologin $NAME"
}
function create-entry
{
local GUEST=$1
local DATABASE=$2
local FUNCTION=$3
local entry; local NAME; local ID
for entry in $(awk -F : '{print $1 ":" $3}' "$DATABASE"); do
NAME=$GUEST.${entry%:*}
if getent ${DATABASE##*/} $NAME; then
echo "Entry $NAME (${DATABASE##*/}) already exists"
else
$FUNCTION $NAME ${entry#*:} $GUEST
fi
done
}
for guest in $(lxc-ls -1); do
create-entry $guest "$LXCPATH/$guest/rootfs/etc/group" create-group
create-entry $guest "$LXCPATH/$guest/rootfs/etc/passwd" create-user
done|sort -u|while read cmd; do
echo "$cmd"
$cmd
done
Requer awk
( mawk
ou gawk
), bash
, getent
, groupadd
, useradd
. Se você comentar a linha:
$cmd
você simplesmente obterá a saída de todos os comandos que, de outra forma, executaria. Adiciona os IDs de usuário e grupo em ordem crescente. No entanto, supõe-se que a entrada lxc.id_map
esteja em um arquivo com o nome do convidado LXC com o nome do arquivo seguindo o esquema /etc/lxc/guests/lxc.${guestname}.conf
. Você pode querer ajustar essa configuração.
Você pode executar novamente o script se adicionar usuários aos convidados.
Isso vai