208

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

# 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

これで、スクリプトは正常に機能しています。

4

19 に答える 19

353

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

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

また、他の回答が指摘したように、ユーザーが存在するかどうかを確認するだけの場合は、すでに終了コードifを確認しているため、 with をid直接使用してください。文字列、 、またはをいじる必要はありません:if[$?$()

if id "$1" &>/dev/null; then
    echo 'user found'
else
    echo 'user not found'
fi

-uとにかく出力を破棄しているので使用する必要はありません)

また、このスニペットを関数またはスクリプトに変換する場合は、終了コードも適切に設定することをお勧めします。

#!/bin/bash
user_exists(){ id "$1" &>/dev/null; } # silent, it just sets the exit code
if user_exists "$1"; code=$?; then  # use the function, save the code
    echo 'user found'
else
    echo 'user not found' >&2  # error messages should go to stderr
fi
exit $code  # set the exit code, ultimately the same set by `id`
于 2013-02-11T12:29:22.270 に答える
38

終了コードを明示的にチェックする必要はありません。試す

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

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

于 2013-02-11T14:08:13.080 に答える
37

単純に使ってみませんか

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

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

于 2013-02-11T10:52:49.613 に答える
26

これは、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
于 2013-09-28T03:43:53.290 に答える
13

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

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi
于 2016-02-24T08:18:47.463 に答える
8

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
于 2018-08-17T11:18:15.500 に答える
6

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

  sudo apt-get finger 
  finger "$username"
于 2017-10-01T00:32:35.120 に答える
3

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

ただし、 のリダイレクトに関連するスクリプトに問題がありstderrます。&>との 2 つの形式>&が存在しますが、この場合は を使用します>&。既にリダイレクトされ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は、あまり良い考えではないかもしれません。物事がうまくいかないとき、その理由はわかりません。

于 2015-02-09T05:15:39.410 に答える
2

シェルの実装 (例: 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
于 2013-02-11T11:00:43.117 に答える