检查用户是否存在

sla*_*fer 143 bash

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

# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Run Code Online (Sandbox Code Playgroud)

因此,如果用户存在,那么我们就会成功,否则用户就不存在了.我在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
Run Code Online (Sandbox Code Playgroud)

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

# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Run Code Online (Sandbox Code Playgroud)

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

我哪里错了?

更新:

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

getent passwd $user  > /dev/null
Run Code Online (Sandbox Code Playgroud)

现在我的脚本工作正常.

Ken*_*ent 262

您也可以按id命令检查用户.

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

  • 很棒的答案 - 只是一个很好的小调整... user_exists = $(id -u user>/dev/null 2>&1; echo $?)user_exists = 0如果"user"存在,或者1如果不存在 (17认同)
  • @Pancho我认为您的变量应命名为user_doesnt_exist (4认同)
  • 这就是我使用的.请参见http://superuser.com/questions/336275/find-out-if-user-name-exists (3认同)
  • 感谢@Pancho的评论,我可以实现这一点,只需将错误发送到 void 并执行 ```validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || 回显0;}```。如果用户存在,则几乎返回 1,如果不存在,则返回 0。 (2认同)

poi*_*oae 28

你为什么不简单地使用

grep -c '^username:' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

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

  • 如果服务器使用其他系统来管理NIS或LDAP等用途,则此操作无效.在这种情况下,您可以使用`getent passwd | grep -c'^ username:'` (18认同)
  • @MarinNedea用户名后的冒号冒号`:`通过与字段分隔符匹配来防止子字符串匹配,因此不会发生您描述的效果。 (2认同)

che*_*ner 26

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

if getent passwd $1 > /dev/null 2>&1; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么您的问题就会出现问题getent,或者您定义的用户数量超出您的想象.


Dan*_*ski 22

这就是我最终在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
Run Code Online (Sandbox Code Playgroud)


Fle*_*der 16

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

if id -u "$user" >/dev/null 2>&1; then
    echo 'user exists'
else
    echo 'user missing'
fi
Run Code Online (Sandbox Code Playgroud)

>/dev/null 2>&1可缩短到&>/dev/nullBash中。

  • 最佳答案 (2认同)

Val*_*ius 13

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

if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then 
echo FOUND
fi
Run Code Online (Sandbox Code Playgroud)

注意:0是root uid.


小智 10

我正以这种方式使用它:

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi
Run Code Online (Sandbox Code Playgroud)


jac*_*nye 6

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

  sudo apt-get finger 
  finger "$username"
Run Code Online (Sandbox Code Playgroud)


小智 6

检查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
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用`cat`?`grep $ USER_NAME / etc / passwd> / dev / null 2>&1` (2认同)

Ste*_*eve 5

使用 sed:

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