7

私はこれをまとめましたが、それはひどいです: (たとえば、そこに魔法の数字があり、テキストの解析..ブー!)

awk -F: '{if($3 >= 1000 && $3 < 2**16-2) print $1}' /etc/passwd

これを行う適切な方法は何ですか?

4

6 に答える 6

12

一部の UNIX システムでは を使用していない/etc/passwdか、そこに指定されていないユーザーがいます。getent passwdを読む代わりに使用する必要があります/etc/passwd

/bin/false私のシステムには、無効になっているユーザーがいて、ログインコマンドをまたはに設定してログインできなくなりました/usr/sbin/nologin。おそらくそれらも除外したいでしょう。

から最小値と最大値を取得するためのarheops awkコマンドとansgarのコードを含む、私にとってうまくいくものは次のとおりですlogin.defs

getent passwd | \
grep -vE '(nologin|false)$' | \
awk -F: -v min=`awk '/^UID_MIN/ {print $2}' /etc/login.defs` \
-v max=`awk '/^UID_MAX/ {print $2}' /etc/login.defs` \
'{if(($3 >= min)&&($3 <= max)) print $1}' | \
sort -u
于 2013-05-19T10:47:08.437 に答える
2

これは、ローカルおよびネットワーク化された passwd データベースの両方が使用されるように、1 つの外部プログラムgetent(@AnsgarWiechers によって提案された) のみを生成する別のアプローチです。これにより、フォークの数が 1 つだけに減りgetentます。ただし、bash4 が必要なため、移植性は多少制限されます。

get_users ()
{ 
    local IFS=$' \t#'
    while read var val ; do
        case "$var" in 
            UID_MIN) min="$val" ;;
            UID_MAX) max="$val" ;;
        esac
    done < /etc/login.defs
    declare -A users
    local IFS=:
    while read user pass uid gid gecos home shell; do
        if (( min <= uid && uid <= max )) && [[ ! $shell =~ '/(nologin|false)$' ]]; then
            users[$user]=1
        fi
    done < <(getent passwd 2>/dev/null)
    echo ${!users[@]}
}
于 2013-05-20T03:09:36.670 に答える
1

/etc/passwd からすべてのユーザーのリストを取得しようとしているだけですか? もしそうなら、これはより簡単な解決策になると思います:

cut -d":" -f1 /etc/passwd

編集:

ユーザー定義のユーザー (システム ユーザーではなく) のリストのみが必要な場合は、次のいずれかを使用できます。

grep -E ":[0-9]{4,6}:[0-9]{4,6}:" /etc/passwd | cut -d: -f1

^ これは、システムがユーザー定義ユーザーの UID と GID に 1000 以上を使用していることを前提としています

grep /home /etc/passwd | cut -d: -f1

^ これは、すべてのユーザー定義ユーザーがホーム ディレクトリを持っていることを前提としています。

その他のソリューションは、より詳細な基準とシステム設定によって異なります。

于 2013-05-19T10:24:53.207 に答える
1

これは@StephenOstermillerの答えを単純化したもので、2つのプロセスだけで完了します。また、読みやすいと思います (awkNR==FNRイディオムに精通している場合)。

getent passwd |
awk 'NR==FNR { if ($1 ~ /^UID_(MIN|MAX)$/) m[$1] = $2; next }
{ split ($0, a, /:/);
  if (a[3] >= m["UID_MIN"] && a[3] <= m["UID_MAX"] && a[7] !~ /(false|nologin)$/)
    print a[1] }' /etc/login.defs -

2 つの入力の異なる分割パターンは、ちょっとした問題です。何とかしてもっとエレガントに修正できるかもしれません。

于 2013-05-21T12:45:15.263 に答える