检查用户是否存在

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

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

我哪里错了?

更新:

读完所有回复之后,我在脚本中发现了这个问题。 问题是我redirectgetent输出的方式。 所以我删除了所有的redirect的东西,并使getent线看起来像这样:

 getent passwd $user > /dev/null 

现在我的脚本工作正常。

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

id -u name给你这个用户的id。 如果用户不存在,你得到命令返回值( $?1

你为什么不简单地使用

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

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

没有必要明确检查退出代码。 尝试

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

如果这不起作用,那么你的getent ,或者你定义的用户比你想象的要多。

这是我最终在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 

我build议使用id命令,因为它testing有效的用户存在和不需要的passwd文件条目意味着相同:

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

注意:0是root uid。

login到服务器。 grep“用户名”/ etc / passwd这将显示用户的详细信息,如果存在。

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

但是,与stderrredirect有关的脚本存在问题。 虽然这两种forms&> ; >&存在,在你的情况下,你要使用>& 。 你已经redirect了stdout ,这就是为什么表单&>不起作用。 您可以通过以下方式轻松进行validation:

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

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

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

这也将stdoutstderrredirect到/dev/null

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

取决于你的shell的实现(例如Busybox vs.成人), [ operator可能启动一个进程,改变$?

尝试

 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 

我以这种方式使用它:

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

晚回答,但finger也显示更多的用户信息

  sudo apt-get finger finger "$username"