找出用户名是否存在


68

如何在Shell脚本中找出当前系统上是否存在给定的用户名?


/etc/passwd并且/etc/shadow不完整。考虑OS X的目录服务或具有类似Active Directory集成的Linux。

Answers:


103

最基本的工具之一可能是id

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

哪个产生

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
您不需要在这里使用反引号-只需使用if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson

1
@戈登当然是完全正确的。谢谢:)
barbaz

“ -u”似乎也不必要
-palacsint

如果只需要if使用否定结果检查器,那会怎样?
Yura Shinkarev

id -u $1 1>/dev/null 2>&1; echo $?可用于管道
JasonWayne '18

20

Getent

此命令旨在收集可由/ etc文件和各种远程服务(例如LDAP,AD,NIS /黄页,DNS等)支持的数据库的条目。

要确定一个密码命名服务之一是否知道用户名,只需运行:

getent passwd username

这也适用于组,主机和其他组件,具体取决于操作系统和实施。


1
虽然Solaris和Linux,而最近也最有BSD系统getent,也没有getent在Mac OS X
barbaz

的确,我错过了Mac OS / X缺少的getent。
jlliagre 2011年

尽管如此,它在它支持的系统上还是很有用的。
丹尼尔·贝克

1
getent很不错,因为您可以查询多个用户名,其中id仅支持一个用户名。
2015年

6

finger

解析的输出finger -m <username>。不幸的是,如果没有找到用户,则没有错误代码,但是如果没有找到用户,则将写入错误输出。到目前为止没有任何缺点。

finger -ms <username> 2>&1 1>/dev/null | wc -l

0如果找到用户将打印(因为没有错误输出),否则将打印较大的数字。

chown

运行(作为任何用户,都令人惊讶):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

如果失败root,则帐号名称无效。

如果以非root用户身份失败,则为“不允许的操作”无效的用户(或等效用户)解析可能的本地化输出。LANG预先设置以可靠地执行此操作。


0

我要说的是,您希望依靠/etc/passwd并且类似(例如,/etc/shadow对于基于Shadow的系统;在主题外的注释中,可能会使用某些类似的系统/etc/master.passwd或其他类似的文件)。

/etc/passwd典型地视为对用户是否存在的绝对权威决定。如果您使用此页面上描述的任何其他方法,并且如果这些其他方法指向现有用户但/etc/passwd没有指向现有用户,那么根据最常见的标准,我认为该用户在系统上不存在软件可能会依赖。

也就是说,我将以另一种方式添加一些可以使用的其他选项的组合。

ls -l /home | grep ^customUserName$<BR> echo $?

显然,将“ customuserName”替换为要检查的用户名。如果这是系统使用的,则将/ home替换为/ users。如果没有为特定用户创建主目录,则可能无法在/ etc / passwd中找到所有用户;如果仅导入用户(即,将文本行导入/ etc / passwd),而主目录未创建,则可能会在/ etc / passwd中找不到所有用户。除非/直到一个人登录,否则获取成功。


我不明白为什么您要声明一个用户,该用户在/ etc / password文件中没有任何条目,但是被系统报告为有效,id或者系统getent上不存在该“正确”的用户,尤其是在OP明确指出命名服务是被考虑。
jlliagre 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.