208

我想创建一个脚本来检查用户是否存在。我正在使用以下逻辑:

# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2

所以如果用户存在,那么我们就成功了,否则用户不存在。我已将上述命令放入 bash 脚本中,如下所示:

#!/bin/bash

getent passwd $1 > /dev/null 2&>1

if [ $? -eq 0 ]; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi

现在,我的脚本总是说用户无论如何都存在:

# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists

为什么上述条件总是评估为 TRUE 并说用户存在?

我哪里错了?

更新:

在阅读了所有回复后,我在脚本中发现了问题。问题是我重定向getent输出的方式。所以我删除了所有重定向的东西,使这getent条线看起来像这样:

getent passwd $user  > /dev/null

现在我的脚本工作正常。

4

19 回答 19

353

您也可以通过id命令检查用户。

id -u name为您提供该用户的 ID。如果用户不存在,你会得到命令返回值 ( $?)1

正如其他答案所指出的那样:如果您只想检查用户是否存在,请直接使用ifwith id,因为if已经检查了exit code。无需摆弄字符串[,$?$():

if id "$1" &>/dev/null; then
    echo 'user found'
else
    echo 'user not found'
fi

(无需使用-u,因为您无论如何都会丢弃输出)

此外,如果您将此代码段转换为函数或脚本,我建议您也适当地设置退出代码:

#!/bin/bash
user_exists(){ id "$1" &>/dev/null; } # silent, it just sets the exit code
if user_exists "$1"; code=$?; then  # use the function, save the code
    echo 'user found'
else
    echo 'user not found' >&2  # error messages should go to stderr
fi
exit $code  # set the exit code, ultimately the same set by `id`
于 2013-02-11T12:29:22.270 回答
38

无需明确检查退出代码。尝试

if getent passwd $1 > /dev/null 2>&1; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi

如果这不起作用,则说明您的 有问题getent,或者您定义的用户比您想象的要多。

于 2013-02-11T14:08:13.080 回答
37

你为什么不简单地使用

grep -c '^username:' /etc/passwd

如果用户存在,它将返回 1(因为用户最多有 1 个条目),如果不存在则返回 0。

于 2013-02-11T10:52:49.613 回答
26

这就是我最终在Freeswitchbash 启动脚本中所做的事情:

# Check if user exists
if ! id -u $FS_USER > /dev/null 2>&1; then
    echo "The user does not exist; execute below commands to crate and try again:"
    echo "  root@sh1:~# adduser --home /usr/local/freeswitch/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $FS_USER"
    echo "  ..."
    echo "  root@sh1:~# chown freeswitch:daemon /usr/local/freeswitch/ -R"
    exit 1
fi
于 2013-09-28T03:43:53.290 回答
18

到目前为止最简单的解决方案:

if id -u "$user" >/dev/null 2>&1; then
    echo 'user exists'
else
    echo 'user missing'
fi

>/dev/null 2>&1可以在 Bash 中缩短为,&>/dev/null如果您只想知道用户是否不存在:

if ! id -u "$user" >/dev/null 2>&1; then
    echo 'user missing'
fi
于 2019-10-30T14:32:58.520 回答
14

我建议使用 id 命令,因为它测试有效的用户是否存在 wrt passwd 文件条目,这不是必需的,这意味着相同:

if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then 
echo FOUND
fi

注意:0 是根 uid。

于 2016-05-09T12:10:39.443 回答
13

我以这种方式使用它:

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi
于 2016-02-24T08:18:47.463 回答
8

检查Linux用户是否存在的脚本

脚本检查用户是否存在

#! /bin/bash
USER_NAME=bakul
cat /etc/passwd | grep ${USER_NAME} >/dev/null 2>&1
if [ $? -eq 0 ] ; then
    echo "User Exists"
else
    echo "User Not Found"
fi
于 2018-08-17T11:18:15.500 回答
6

迟到的答案,但finger也显示了有关用户的更多信息

  sudo apt-get finger 
  finger "$username"
于 2017-10-01T00:32:35.120 回答
4

使用 sed:

username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
    echo "User [$username] already exists"
else
    echo "User [$username] doesn't exist"
fi
于 2019-07-11T05:51:35.350 回答
4

用户信息存储在 /etc/passwd 中,因此您可以使用“grep 'usename' /etc/passwd”来检查用户名是否存在。同时你可以使用“id”shell命令,它会打印用户id和组id,如果用户不存在,它会打印“no such user”消息。

于 2019-02-19T02:02:32.473 回答
3

实际上我无法重现该问题。问题中编写的脚本工作正常,但 $1 为空的情况除外。

但是,脚本中存在与stderr. 虽然这两种形式存在&>>&但在您的情况下,您想使用>&. 您已经重定向stdout,这就是表单&>不起作用的原因。您可以通过这种方式轻松验证它:

getent /etc/passwd username >/dev/null 2&>1
ls

您将看到1在当前目录中命名的文件。你想2>&1改用,或者使用这个:

getent /etc/passwd username &>/dev/null

这也将stdout和重定向stderr/dev/null

警告重定向stderr/dev/null可能不是一个好主意。当事情出错时,你将不知道为什么。

于 2015-02-09T05:15:39.410 回答
2

根据您的 shell 实现(例如 Busybox 与成熟),[操作员可能会启动一个进程,更改$?.

尝试

getent passwd $1 > /dev/null 2&>1
RES=$?

if [ $RES -eq 0 ]; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi
于 2013-02-11T11:00:43.117 回答
2

登录到服务器。 grep "username" /etc/passwd 这将显示用户详细信息(如果存在)。

于 2017-05-02T10:13:22.903 回答
1

下面是检查操作系统分布的脚本,如果不存在则创建用户,如果用户存在则不执行任何操作。

#!/bin/bash

# Detecting OS Ditribution
if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS=$NAME
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
elif [ -f /etc/lsb-release ]; then
    . /etc/lsb-release
    OS=$DISTRIB_ID
else
    OS=$(uname -s)
fi

 echo "$OS"

 user=$(cat /etc/passwd | egrep -e ansible | awk -F ":" '{ print $1}')

 #Adding User based on The OS Distribution
 if [[ $OS = *"Red Hat"* ]] || [[ $OS = *"Amazon Linux"* ]] || [[ $OS = *"CentOS"*  
]] && [[ "$user" != "ansible" ]];then
 sudo useradd ansible

elif [ "$OS" =  Ubuntu ] && [ "$user" != "ansible" ]; then
sudo adduser --disabled-password --gecos "" ansible
else
  echo "$user is already exist on $OS"
 exit
fi
于 2019-10-15T07:40:38.720 回答
1

如果系统用户some_user不存在则创建

if [[ $(getent passwd some_user) = "" ]]; then
    sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi
于 2020-01-27T16:33:10.577 回答
1

我喜欢这个不错的单线解决方案

getent passwd username > /dev/null 2&>1 && echo yes || echo no

并在脚本中:

#!/bin/bash

if [ "$1" != "" ]; then
        getent passwd $1 > /dev/null 2&>1 && (echo yes; exit 0) || (echo no; exit 2)
else
        echo "missing username"
        exit -1
fi

利用:

[mrfish@yoda ~]$ ./u_exists.sh root
yes
[mrfish@yoda ~]$ echo $?
0

[mrfish@yoda ~]$ ./u_exists.sh
missing username
[mrfish@yoda ~]$ echo $?
255

[mrfish@yoda ~]$ ./u_exists.sh aaa
no
[mrfish@indegy ~]$ echo $?
2
于 2020-06-10T07:09:00.043 回答
0
echo "$PASSWORD" | su -c "cd /" "$USER"
if [ "$?" = "0" ];then
 echo "OK"
else
 echo "Error"
fi
于 2021-09-18T10:33:27.793 回答
0
#!/bin/bash
read -p "Enter your Login Name: " loginname
home=`grep -w $loginname /etc/passwd | cut -ef:6 -d:`
if [ $home ]
    echo "Exists"
else
    echo "Not Exist"
fi
于 2022-02-01T11:39:41.367 回答