2024-12-26 06:00:03

检查用户是否存在

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

# 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,并说用户存在?

我哪里说错了?

更新:

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

getent passwd $user  > /dev/null

现在我的脚本运行正常。


当前回答

我是这样用的:

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

其他回答

检查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

我喜欢这个漂亮的单线解决方案

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

use:

[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

没有必要显式地检查退出代码。试一试

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

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

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

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

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

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

备注:0为root uid。