ステートメントがetc / passwdのユーザーIDを照会する場合?


8

bashを/etc/passwd使用して、IDが1000を超えるユーザーを照会しようとしています。ユーザーが存在する場合は、何か他のことを行います。私は困惑しています。どんな助けでもありがたいです。

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi

1
これはbash(シェル)である必要がありますか?
スティーブンラウフ

うん、ごめん。bashの使用
user3239222

回答:


8

これを試して:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

最初のコードは、4桁以上のuidを持つ行をgrep検索passwdします。2つ目grepは、uid 1000の行を除外します。終了ステータスは、行が残っている場合は0、残っていない場合は1になります。


構文エラーが発生する:予期しないファイルの終わり
user3239222

あなたはそれをthen線などでフォローしなければなりません
トム・ジッチ

1
忘れてた; 2番目のgrep -Evqを作成して、その出力を抑制します。
トムジッチ

4
その見た目から、これは少なくとも4文字の長さのUIDフィールドを探します。これはここでは機能しますが、カットオフ値が10の累乗以外の場合はあまり役に立ちません。また、いくつかの数値が何らかの理由で先行ゼロを取得した場合、結果が混乱する可能性があります。
ilkkachu 2017年

1
YP / NISまたはLDAPを使用する場合getent passwdは、/etc/passwdファイルの代わりにの出力を解析します。
クサラナンダ

16

でそれを行うにはbashループ、私が使用することをお勧めreadIFSのように:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd

試してみましたが、すべてのユーザーLTおよびGTを出力します
user3239222

1
一部のユーザーをLTとして出力し、残りをGTとして出力します。これはあなたが必要だと私が思ったものです。
スティーブンラウフ

私は見ることなど/パスワードを確認したい場合は任意のUIDを1000以上存在し、trueの場合、何かをする場合はfalse。..他の何かやる
user3239222

4
あなたのコメントのキーワードは、もしあれば、質問は彼らのため言った。複数、あなたが各ユーザーを処理するつもりであることを私示しました。しかし、ここでは他の三つの答えは....ので、そのように読んでいない
スティーブン・ラウフ

14

/etc/passwd直接読み取る代わりに、を使用する必要がありますgetent passwd。これは、一部のユーザーがLDAPなどに保存されている場合にも機能します。awkコロンで区切られた出力形式に適しているはずです。

これにより、UID> 1000のすべてのユーザーのユーザー名が出力されます。

getent passwd | awk -F: '$3 > 1000 {print $1}'

そして、これはfound、少なくとも1つが見つかった場合にのみ印刷されます。

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'

ifステートメントでこれをどのように使用しますか?$ 3> 1000の場合、何かを行う
user3239222

最初のデスクトップユーザーが1000に等しいので、私は、これを少し変更し、「誰も」のようなユーザーの他の種類がありますので、我々はまた、(私はちょうど任意に2000に設定した)上限を必要とする:getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming

@benjaoming、エラー、はい、>= 1000確かに理にかなっているようです。でも> 1000、どういうわけか質問がありました。nobodyは一般的には6553xまた3276xはのようですので、おそらくその上限を少し上げることができます。
ilkkachu

4

この構成はあまり意味がありません。

"$(id -u)" -gt "1000" </etc/passwd

このidコマンドは、入力のリダイレクトに関係なく機能します。リダイレクトはここではどうしても意味がありません。

このパイプラインをテスト比較で使用できます。マシンの最大のユーザーIDが表示されます。

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

一部のシステムではnobody、UIDを持つユーザーが存在する可能性があるため、微調整することをお勧めします65534


1

トムのコードを使用してこれは私のために働いた。

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi

ユーザーmrBlonde:x:1001:1001 :: / home / mrBlonde:/ bin / bashを作成しました。存在すると言うコードを実行すると、ユーザーを削除すると、存在しないと言います。L)
user3239222 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.