私はこれをまとめましたが、それはひどいです: (たとえば、そこに魔法の数字があり、テキストの解析..ブー!)
awk -F: '{if($3 >= 1000 && $3 < 2**16-2) print $1}' /etc/passwd
これを行う適切な方法は何ですか?
一部の 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
これは、ローカルおよびネットワーク化された 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[@]}
}
/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
^ これは、すべてのユーザー定義ユーザーがホーム ディレクトリを持っていることを前提としています。
その他のソリューションは、より詳細な基準とシステム設定によって異なります。
これは@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 つの入力の異なる分割パターンは、ちょっとした問題です。何とかしてもっとエレガントに修正できるかもしれません。