如何从uid获取用户名

meh*_*ani 5 linux shell bash

我正在尝试编写一个 bash 脚本,该脚本根据用户提供的 uid 显示用户名:

#!/bin/bash

read -p "donner l UID" cheruid

 if [ $(grep -w $cheruid) -n ]
 then
    grep -w $cheruid /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"

fi
Run Code Online (Sandbox Code Playgroud)

当我执行这个终端只显示提示信息然后停止工作。

我错过了什么吗?

Sté*_*las 13

使用 GNU id,您可以执行以下操作:

id -un -- "$cheruid"
Run Code Online (Sandbox Code Playgroud)

这将查询帐户数据库(是否存储在/etc/passwdLDAP、NIS+、RDBMS...中)以获取具有该 uid 的第一个用户名。

通常,每个 uid 只有一个用户名,但这并不能保证,用户帐户数据库中的键是用户名,而不是用户 id。

如果您想知道给定 uid 的所有用户名,您可以执行以下操作:

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'
Run Code Online (Sandbox Code Playgroud)

但这可能不适用于某些不可枚举的帐户数据库(有时对于基于 LDAP 的大型帐户就是这种情况)。


Kus*_*nda 5

$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself
Run Code Online (Sandbox Code Playgroud)

myself我的系统上有一个UID 为 1001的用户)

这将查询passwd给定 UID的数据库,从该响应中去除用户名并将结果用作printf. 这在 macOS 上不起作用。

要捕获未知的 UID:

$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
Run Code Online (Sandbox Code Playgroud)
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER
Run Code Online (Sandbox Code Playgroud)

作为在命令行上采用任意数量 UID 的脚本(输出略有改变):

#!/bin/sh

for uid do
    printf 'User with UID %d is %s\n' "$uid" \
        "$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done
Run Code Online (Sandbox Code Playgroud)

测试(这将通过我的 OpenBSD 系统上的一些服务帐户的 UID):

$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd
Run Code Online (Sandbox Code Playgroud)