我想创建一个脚本来检查用户是否存在.我正在使用以下逻辑:
# 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
poi*_*oae 28
你为什么不简单地使用
grep -c '^username:' /etc/passwd
Run Code Online (Sandbox Code Playgroud)
如果用户存在,它将返回1(因为用户具有最多1个条目),如果不存在,则返回0.
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中。
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)
迟到的答案,但finger也显示了有关用户的更多信息
sudo apt-get finger
finger "$username"
Run Code Online (Sandbox Code Playgroud)
小智 6
#! /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)
使用 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)