Linux内のグループに属するユーザーを見つけるにはどうすればよいですか?


68

最近、新しいユーザーを作成し、特定のグループに割り当てています。特定のグループに割り当てられているすべてのユーザーを表示するコマンドがあるかどうか疑問に思っていましたか?「グループ」コマンドを使用しようとしましたが、これを使用するたびに「グループ:見つかりません」と表示されます


3
それがgroupsコマンドです。これはcoreutilsの一部であるため、Linuxで使用することはほとんどありません。
トーマスディッキー

@ThomasDickeyしかし、それは可能です-一部のNASのように。
トーマスW.

回答:


43

grepを使用できます。

grep '^group_name_here:' /etc/group

これは、補助グループメンバーシップのみをリストし、このグループをプライマリグループとして持つユーザーはリストしません。また、LDAPなどのネットワークサービスのグループではなく、ローカルグループのみを検索します。


6
集中認証では機能しません。
マキシムEgorushkin

1
これは、おそらくプライマリ/セカンダリの違いが原因で非常に混乱する可能性があります。私sudo lid -g {group}はこの回答がグループ内の8人のユーザーをsudo lid -g {group}リストするのに対し、10をリストするシステムを持っているので、これを避けるべきだと思います
。– DKroot

getent以下の@Murray Jensenによる回答をご覧ください
scrutari

84

私はgetentコマンドを使用することを好みます...

getentはシステムと同じネームサービスを使用するため、getentは、LDAPなどのネットワーク情報ソースから取得した情報を含む、すべての情報を表示します。

したがって、グループの場合は、次を使用する必要があります...

getent group name_of_group

どこname_of_groupを調べたい基で置換されています。これは補足グループメンバーシップのみを返すことに注意してください。このグループをプライマリグループとして持っているユーザーは含まれません。

実行できるルックアップは他にもたくさんあります... passwdもう1つの便利なもので、プライマリグループをリストする必要があります。


1
管理者ではなく、グループ情報が他のサーバーに保存されている場合、他の回答は適用されません。
アンドレスアルカラス

1
これは、おそらくプライマリ/セカンダリの違いが原因で非常に混乱する可能性があります。私sudo lid -g {group}はこの回答がグループ内の8人のユーザーをsudo lid -g {group}リストするのに対し、10をリストするシステムを持っているので、これを避けるべきだと思います
。– DKroot

12

簡単に groups [username]

すべてのローカルユーザーとローカルグループを一覧表示する場合は、次の操作を実行できます。

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

「groups:command not found」というメッセージが表示された場合は、環境のパスを編集して、パスをリセットしてください。 PATH=$(getconf PATH)


| grep {group}追加された場合、特定のグループに対して機能し、getent group name_of_groupまたはgrep '^group_name_here:' /etc/group
DKroot

1
の代わりにcat /etc/passwdgentent passwdnis / ldapのユーザーが引き続きリストされるように使用する必要があります。唯一の欠点は、かなり時間がかかることです。
ブライアンミントン

8
groupmems -g groupname -l

指定されたグループのすべてのユーザーをリストします。


groupmemsほとんどのLinuxディストリビューションで使用されるシャドウユーティリティの一部であることに注意してください。ただしgroupmems、現在Debianおよび派生物には存在しません(バグは修正済みですが、まだリリースに含まれていません(2016年11月現在))
StéphaneChazelas

2
また、LDAPやその他のユーザーデータベース内のgroupmemsグループで/etc/groupはなく、グループのみを処理し、/ etc / gshadowを開こうとするとスーパーユーザー権限が必要になることに注意してください。
ステファンシャゼル

上記の警告にもかかわらず、このコマンドは出力(cutおよび友人)の追加の解析を必要としないため、特定の状況に最適です。
ボン

これは、おそらくプライマリ/セカンダリの違いが原因で非常に混乱する可能性があります。これを避けるべきだと思いますsudo lid -g {group}。私はこの回答がグループ内の8人のユーザーをsudo lid -g {group}リストするのに対し、10をリストするシステムを持っています。
DKroot18年

5

誰も言及していないことに驚いた

id <user>

このコマンドは、ユーザーが属するグループのリストを表示します。


3
なぜなら、タイトルとは反対に、質問者は、質問で詳述されているように、特定のユーザーのグループではなく、特定のグループ内のユーザーを知りたいと思ったからです。内容に合わせてタイトルを変更しました。
ドゥブ

あぁ、なるほど。質問文をもっとよく読んでおくべきだった。ありがとう。
アレックス

4

groupsコマンドは、ユーザーのグループメンバーシップを出力します。lidコマンドを使用して、次のようなグループ内のユーザーをリストできます。

# lid -g <groupname>

4
lid多くのディストリビューションではデフォルトでインストールされないlibuserの一部です。
クリスダウン

2

OPは、groupsコマンドを使用する可能性を排除するために質問を述べました。これはLinuxのcoreutilsの一部であるため、(a)削除されたか、(b)OPが名前の入力ミスです。

groupsたとえば、OPは次のよ​​うに使用できます。

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

1つは、のグループ名に対するgrepだけの回答を提案しました/etc/group。意図したとおりに機能することもあります。

grepを少し上手に使用するには、次の構文を考慮します/etc/group

group_name:password:GID:user_list

したがって、最初のコロンのの部分のみが有効なグループ名になります。構文に関係のない単純なgrepは、ファイルから誤解を招く一致を拾う可能性があります(そしてそうするでしょう)。正規表現を使用して、必要なものとgrepを正確に一致させます。

grep -E '^users:' /etc/group |sed -e 's/^.*://'

または、シェル変数を使用します。

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

ただし、それはデフォルトグループにないもののみをリストしますそれらを追加するには、パスワードファイルを考慮する必要があります。たとえば、からgroup-id番号を抽出し、から/etc/groupデフォルトグループに一致するユーザーを印刷します。/etc/passwdたとえば、

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

grepとsedを使用して同じことを実行できますが、awkを使用するよりも多くの作業が必要です。

を使用して提案された別の提案された回答はgetent、Linuxマシン上にもある可能性があります(Debianでは、GNU libcの一部です)。ただし、それを簡単に確認すると、/etc/groupコンテンツのみが提供されていることがわかります。

私は(ほとんどのように)持っていないlibusersか、lidインストールされていないので、OPの条件を満たすかどうかについてコメントすることはできません。

idグループ情報を提供するプログラムもあります。誰かが可能な答えとしてそれを拡張するかもしれません。


またはsed -n "s/^$groupname:.*://p" /etc/group、グループ名にRE演算子が含まれていると、間違った結果が報告される可能性.があります(たとえば、グループ名で珍しいことではありません)。
ステファンシャゼル

GNU getentはLDAP / NISも照会しますが、グループデータベースで列挙が明示的に無効になっている場合はそうではありません。
ステファンシャゼル

groups与えられたグループのメンバーのリストとは対照的に、与えられたユーザーがメンバーであるグループをリストするので、助けにはならないことに注意してください。
ステファンシャゼル

2

チャームのように機能します:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

受け入れられた@ARGの回答とは異なり、このコマンドは、プライマリグループとして<groupname>を持つユーザーをリストします
-Bhavik

これは受け入れられる答えである必要があります
ニコライネノフ

1
同意しません。/ etc / passwdのユーザーを読み取るため、これはLDAPなどにアクセスする他のnsswitchモジュールでは機能しません。
IvanVučica17年

私にとっては正しく動作しませんでした。グループには4人のメンバーがいましたが、sudo lid -gリストは8です。@ Bhavik受け入れられた答えも正しくありません。
DKroot

2

libuser(「lid」の場合)またはmembers(「members」の場合)をインストールするように指示する人もいます。しかし、ログイングループメンバーシップでこの問題を処理したhttps://unix.stackexchange.com/a/349648/77959の答えに基づいて、そのスクリプトでカバーされていない別のグループが見つかりました。だから-ここに両方の​​アプローチの最高の組み合わせがあります:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

それはgetent、grep を含む回答とは異なり、私のシステムで正しく機能しました'^group_name_here:' /etc/group
-DKroot

0

user3717722アプローチのこの変更により、NISデータベース内のグループメンバーがリストされます。

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.