ユーザーが存在するかどうかを確認する


164

ユーザーが存在するかどうかを確認するスクリプトを作成したい。以下のロジックを使用しています:

# 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

今、私のスクリプトは正常に動作しています。


使用$?すると、testコマンドの戻りコードが返されると思います。以下の回答を参照してください。
user000001

それはあなたが実行している正確なコードですか?呼び出し先getentと呼び出し先の間に「エコー」デバッグステートメントはありませんifの文?これにより、$?へのecho呼び出しではなく、の終了ステータスがチェックされgetentます。
chepner 2013

4
ええ、私はあなたが2>&1代わりにという意味だと思います2&>1
Tim Ludwinski、2016年

コードは空でない入力で機能しますが、$1設定されていない場合、ifステートメントはtrueを返します。私のテストから、解決策は$1二重引用符で囲むことです:getent passwd "$1" > /dev/null 2&>1
ビンス

回答をマークしてください
エフレン2018

回答:


292

idコマンドでユーザーを確認することもできます。

id -u nameそのユーザーのIDを提供します。ユーザーが存在しない場合、コマンドの戻り値($?)を取得します1



24
素晴らしい答え-うまく機能するちょっとした微調整... user_exists = $(id -u user> / dev / null 2>&1; echo $?)user_exists = 0 "user"が存在する場合は1、存在しない場合は1
Pancho

5
@Pancho変数の名前はuser_doesnt_existにする必要があると思います
Will Sheppard、

1
@WillSheppard:一般的なレベルでは、bashでのブール処理は明確ではないと私は考えており、通常、コードで暗黙のブール推論を回避します。次のmake面白い読み物と興味深いことに、両方の賛成0 =真とbashの目的のために<いない0> =偽、とはないが事実上の、私もブールの観点から使用している変数名と整列:stackoverflow.com/a/5431932 / 3051627stackoverflow.com/questions/2933843/…
パンチョ

2
@Panchoのコメントのおかげで、エラーをvoidに送信してを実行するだけで、それを実現できましたvaliduser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }。つまり、ユーザーが存在する場合は1を返し、存在しない場合は0を返します。
lu1s

31

単純に使用しないのはなぜですか

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

ユーザーが存在する場合は1(ユーザーに最大1つのエントリがあるため)を返し、存在しない場合は0を返します。


19
サーバーがNISやLDAPなどの使用を管理する別のシステムを使用している場合、これは機能しません。この場合、使用できますgetent passwd | grep -c '^username:'
Toby Jackson

1
ユーザー名を持っている場合は「1」を返し、「test1」と言い、「test」という新しいユーザー名を作成するとします。
マリンネディア

2
@MarinNedea :ユーザー名の後のコロンは、フィールドセパレータと照合することで部分文字列の照合から保護するため、説明した効果は起こりません。
ステフェイン・グーリッホン

30

終了コードを明示的に確認する必要はありません。試す

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

それがうまくいかない場合は、に問題があるかgetent、ユーザーが思ったよりも多くのユーザーを定義しています。


23

これは私が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

14

idコマンドを使用することをお勧めします。これは有効なユーザーの存在をテストするので、passwdファイルのエントリは不要ですが、同じことを意味します。

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

注:0はroot uidです。


12

私はそれをそのように使っていました:

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

9

はるかに簡単なソリューション:

if id -u user >/dev/null 2>&1; then
    echo user exists
else
    echo user missing
fi

>/dev/null 2>&1短縮することが可能&>/dev/nullバッシュに。


はい、ありがとうございます!
Zane Hitchcox

7

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

2
なぜ使用catgrep $USER_NAME /etc/passwd >/dev/null 2>&1
Alexx Roche 2018

はい、Alexx Roche。猫を使う必要はありません。初心者のためにコンセプトを視覚化するためのより良い方法を得るために私は使っています。
Bakul Gupta 2018

6

遅い回答ですがfinger、ユーザーに関する詳細情報も表示されます

  sudo apt-get finger 
  finger "$username"

OPはDebianを使用していない可能性があります。
narendra-choudhary

3

実際には問題を再現できません。質問に書かれているスクリプトは、$ 1が空の場合を除いて、正常に機能します。

ただし、のリダイレクトに関連するスクリプトに問題がありますstderr。二つの形式が&>して>&存在するが、あなたのケースでは、あなたが使用したいです>&。すでにリダイレクトされstdoutているため、フォーム&>は機能しません。次の方法で簡単に確認できます。

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

1現在のディレクトリで名前が付けられたファイルが表示されます。2>&1代わりに使用するか、これを使用します:

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

これもリダイレクトstdoutstderr/dev/null

警告のリダイレクトをstderrする/dev/nullかもしれないことは、このような良いアイデアではありません。物事がうまくいかないとき、あなたには理由がわかりません。


3

ユーザー情報は/ etc / passwdに保存されるため、「grep 'usename' / etc / passwd」を使用してユーザー名が存在するかどうかを確認できます。一方、「id」シェルコマンドを使用すると、ユーザーIDとグループIDが出力されます。ユーザーが存在しない場合は、「そのようなユーザーはありません」というメッセージが出力されます。


2

サーバーにログインします。 grep "username" / etc / passwd これは、存在する場合、ユーザーの詳細を表示します。


3
これは、「username」を含むすべてのユーザー名にも一致します。例:「some_username」。やりたいことif grep -q "^username:" /etc/passwd; then ...
maedox

2

sedの使用:

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

1

シェルの実装(例: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

変更し$?ても同じ出力が得られます。これはbashのバージョンである:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
slayedbylucifer

試してみるif test "$RES" == "0"; then ...
Eugen Rieck 2013

1
$?[実行前に展開されるため、問題ありません。
chepner 2013

1
代わりに、コマンドの結果を試験するには、コマンドを直接テストすることができます if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
GMartinez

1

以下は、OSディストリビューションを確認し、存在しない場合はユーザーを作成し、ユーザーが存在する場合は何もしないスクリプトです。

#!/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

0

システムユーザーsome_userが存在しない場合は作成します

if [[ $(getent passwd some_user) = "" ]]; then
    sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.