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
(mawk
或gawk
), bash
, getent
, groupadd
, useradd
。如果您注释掉该行:
$cmd
您将简单地获得它将运行的所有命令的输出。它按升序添加用户和组 ID。但是,它确实假设该lxc.id_map
条目位于以 LXC guest 命名的文件中,文件名遵循 schema /etc/lxc/guests/lxc.${guestname}.conf
。您可能想要调整该设置。
如果您在访客中添加用户,则可以重新运行该脚本。
这会