检查用户是否存在

时间:2013-02-11 10:50:45

标签: bash

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

# 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

现在我的脚本工作正常。

17 个答案:

答案 0 :(得分:241)

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

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

答案 1 :(得分:25)

为什么不简单地使用

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

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

答案 2 :(得分:23)

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

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

如果这不起作用,则getent出现问题,或者您定义的用户数量超出您的预期。

答案 3 :(得分:20)

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

# 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

答案 4 :(得分:13)

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

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

注意:0是root uid。

答案 5 :(得分:8)

我正以这种方式使用它:

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi

答案 6 :(得分:5)

Script to Check whether Linux user exists or not

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

#! /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

答案 7 :(得分:3)

其实我无法重现这个问题。问题中写的脚本工作正常,除了$ 1为空的情况。

但是,与stderr重定向相关的脚本存在问题。虽然存在&>>&这两种格式,但在您的情况下,您希望使用>&。您已经重定向stdout,这就是&>形式不起作用的原因。您可以通过这种方式轻松验证:

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

您将在当前目录中看到名为1的文件。您想要使用2>&1,或者使用它:

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

这也会将stdoutstderr重定向到/dev/null

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

答案 8 :(得分:3)

用户信息存储在/ etc / passwd中,因此您可以使用“ grep'usename'/ etc / passwd”来检查用户名是否存在。 同时可以使用“ id” shell命令,它将显示用户ID和组ID,如果该用户不存在,则将显示“无此用户”消息。

答案 9 :(得分:3)

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

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

在Bash中,>/dev/null 2>&1可以缩短为&>/dev/null

答案 10 :(得分:2)

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

答案 11 :(得分:2)

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

  sudo apt-get finger 
  finger "$username"

答案 12 :(得分:1)

根据您的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

答案 13 :(得分:1)

使用sed:

username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
    echo "User [$username] already exists"
else
    echo "User [$username] doesn't exist"
fi

答案 14 :(得分:0)

下面是检查操作系统分发并创建User(如果不存在)和不执行任何操作(如果用户存在)的脚本。

#!/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

答案 15 :(得分:0)

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

if [[ $(getent passwd some_user) = "" ]]; then
    sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi

答案 16 :(得分:0)

我喜欢这种不错的一线解决方案

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