如何在 shell 脚本中找出当前系统上是否存在给定的用户名?
/etc/passwd
并且/etc/shadow
不完整。请考虑 OS X 的目录服务,或具有 Likewise Active Directory 集成的 Linux。
答案1
用于此目的的最基本工具之一可能是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
盖特恩
此命令旨在收集可由 /etc 文件和各种远程服务(如 LDAP、AD、NIS/Yellow Pages、DNS 等)支持的数据库的条目。
要确定某个密码命名服务是否知道某个用户名,只需运行:
getent passwd username
这也适用于群组、主机和其他人,具体取决于操作系统和实现。
答案3
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
提前设置以可靠地执行此操作。
答案4
我想说的是,你会想要依赖/etc/passwd
和类似的东西(例如,/etc/shadow
基于 Shadow 的系统;在题外话中,一些类似的系统可能会使用/etc/master.passwd
或其他类似的文件)。
通常/etc/passwd
被视为用户是否存在的绝对权威决定。如果您使用本页中描述的任何其他方法,并且如果这些其他方法指向现有用户但实际上/etc/passwd
没有,那么我会说该用户在系统中不存在,这是软件可能依赖的最常见标准的定义。
话虽如此,我会采用另一种方式来增加一些可以使用的其他选项。
ls -l /home | grep ^customUserName$<BR> echo $?
显然,将“customuserName”替换为要检查的用户的名称。如果系统使用 /users,则将 /home 替换为 /home。如果没有为特定用户创建主目录,则可能无法在 /etc/passwd 中找到所有用户,如果您只是导入用户(即,将文本行导入 /etc/passwd),并且除非/直到有人登录,否则不会创建主目录,则可能会出现这种情况。