是否可以在 Linux 系统中注册“虚拟”用户/组 ID?

是否可以在 Linux 系统中注册“虚拟”用户/组 ID?

Linux 中是否有标准化机制可用于将用户名与用户 ID 绑定在一起,而无需实际创建可以登录的系统帐户?

鉴于能够连接到 Windows 服务器并向用户提供 UID,这似乎是可能的。通常处于较高的数字范围内。

我需要/想要的目的是能够为仅作为从属 ID 存在的组和用户分配有意义的名称()。

我认为这可以通过与以下相关的事情来完成国家安全局(5)但空手而来。


一些背景

用户的视觉表示

在主机系统上,通常使用 64k UID(和 GID),但是0..2^32-1范围是可用的用户 ID。因此,我们可以将整个范围中的子范围分配为给定用户的从属 ID。例如,我们可以说范围100000..2^32-1被分配给root根命名空间中的用户。

就 LXC 而言(),它使用 userns,根命名空间位于主持人100000..165535和从属 ID 映射到子命名空间,这样子命名空间内主机上的一系列 UID将显示为0..65535.

因此,文件拥有者root 里面子命名空间将显示为 UID 100000 所有在主机上

因此,如果我可以在主机系统中为这个“虚拟”UID 100000 分配一个有意义的名称,而无需实际创建用户帐户,那将会非常有用。

这就是我正在寻找的。


现在我正在使用这个帮助程序脚本作为解决方法。请随意根据 StackExchange 或 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

它需要awk(mawkgawk), bash, getent, groupadd, useradd。如果您注释掉该行:

        $cmd

您将简单地获得它将运行的所有命令的输出。它按升序添加用户和组 ID。但是,它确实假设该lxc.id_map条目位于以 LXC guest 命名的文件中,文件名遵循 schema /etc/lxc/guests/lxc.${guestname}.conf。您可能想要调整该设置。

如果您在访客中添加用户,则可以重新运行该脚本。

这会

相关内容