我想创建一个脚本来检查用户是否存在。我使用下面的逻辑:
# 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并说用户存在?
我哪里错了?
更新
阅读完所有回复后,我在脚本中发现了问题。问题是我重定向getent
输出的方式。所以我删除了所有重定向内容并使getent
行看起来像这样:
getent passwd $user > /dev/null
现在我的脚本工作正常。
答案 0 :(得分:241)
您还可以通过id
命令检查用户。
id -u name
为您提供该用户的ID。
如果用户不存在,则获得命令返回值($?
)1
答案 1 :(得分:25)
为什么不简单地使用
grep -c '^username:' /etc/passwd
如果用户存在,它将返回1(因为用户有最多1个条目),如果不存在,则返回0。
答案 2 :(得分:23)
无需明确检查退出代码。尝试
if getent passwd $1 > /dev/null 2>&1; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
如果这不起作用,则getent
出现问题,或者您定义的用户数量超出您的预期。
答案 3 :(得分:20)
这是我最终在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
答案 4 :(得分:13)
我建议使用id命令,因为它测试有效用户存在wrt passwd文件条目,这是不必要的意思相同:
if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then
echo FOUND
fi
注意:0是root uid。
答案 5 :(得分:8)
我正以这种方式使用它:
if [ $(getent passwd $user) ] ; then
echo user $user exists
else
echo user $user doesn\'t exists
fi
答案 6 :(得分:5)
Script to Check whether Linux user exists or not
#! /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
答案 7 :(得分:3)
其实我无法重现这个问题。问题中写的脚本工作正常,除了$ 1为空的情况。
但是,与stderr
重定向相关的脚本存在问题。虽然存在&>
和>&
这两种格式,但在您的情况下,您希望使用>&
。您已经重定向stdout
,这就是&>
形式不起作用的原因。您可以通过这种方式轻松验证:
getent /etc/passwd username >/dev/null 2&>1
ls
您将在当前目录中看到名为1
的文件。您想要使用2>&1
,或者使用它:
getent /etc/passwd username &>/dev/null
这也会将stdout
和stderr
重定向到/dev/null
。
警告将stderr
重定向到/dev/null
可能不是一个好主意。当出现问题时,你将不知道为什么。
答案 8 :(得分:3)
用户信息存储在/ etc / passwd中,因此您可以使用“ grep'usename'/ etc / passwd”来检查用户名是否存在。 同时可以使用“ id” shell命令,它将显示用户ID和组ID,如果该用户不存在,则将显示“无此用户”消息。
答案 9 :(得分:3)
到目前为止,最简单的解决方案是
if id -u user >/dev/null 2>&1; then
echo user exists
else
echo user missing
fi
在Bash中,>/dev/null 2>&1
可以缩短为&>/dev/null
。
答案 10 :(得分:2)
登录服务器。 grep“username”/ etc / passwd 这将显示用户详细信息(如果存在)。
答案 11 :(得分:2)
迟到的答案,但finger
也会显示有关用户的更多信息
sudo apt-get finger
finger "$username"
答案 12 :(得分:1)
根据您的shell实施情况(例如,Busybox与成年人),[
运营商可能会启动流程,更改$?
。
尝试
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
答案 13 :(得分:1)
使用sed:
username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
echo "User [$username] already exists"
else
echo "User [$username] doesn't exist"
fi
答案 14 :(得分:0)
下面是检查操作系统分发并创建User(如果不存在)和不执行任何操作(如果用户存在)的脚本。
#!/bin/bash
# Detecting OS Ditribution
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$NAME
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
elif [ -f /etc/lsb-release ]; then
. /etc/lsb-release
OS=$DISTRIB_ID
else
OS=$(uname -s)
fi
echo "$OS"
user=$(cat /etc/passwd | egrep -e ansible | awk -F ":" '{ print $1}')
#Adding User based on The OS Distribution
if [[ $OS = *"Red Hat"* ]] || [[ $OS = *"Amazon Linux"* ]] || [[ $OS = *"CentOS"*
]] && [[ "$user" != "ansible" ]];then
sudo useradd ansible
elif [ "$OS" = Ubuntu ] && [ "$user" != "ansible" ]; then
sudo adduser --disabled-password --gecos "" ansible
else
echo "$user is already exist on $OS"
exit
fi
答案 15 :(得分:0)
创建系统用户some_user
(如果不存在)
if [[ $(getent passwd some_user) = "" ]]; then
sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi
答案 16 :(得分:0)
我喜欢这种不错的一线解决方案
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
使用:
[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