检查用户是否存在
我想创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为空的情况。
但是,与stderr
redirect有关的脚本存在问题。 虽然这两种forms&>
; >&
存在,在你的情况下,你要使用>&
。 你已经redirect了stdout
,这就是为什么表单&>
不起作用。 您可以通过以下方式轻松进行validation:
getent /etc/passwd username >/dev/null 2&>1 ls
您将在当前目录中看到一个名为1
的文件。 你想用2>&1
来代替,或者使用这个:
getent /etc/passwd username &>/dev/null
这也将stdout
和stderr
redirect到/dev/null
。
警告将stderr
redirect到/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"