[解決済み】Linuxのグループ内の全ユーザーをリストアップする方法は?
2022-04-01 21:33:08
質問
Linuxで、あるグループのメンバー全員をリストアップするにはどうしたらよいですか(他のユニックスの場合もあります)?
どのように解決するのですか?
残念ながら、私が知っている限りでは、これを行うための良い、ポータブルな方法はありません。 他の人が提案しているように /etc/group を解析しようとすると、そのグループをプライマリグループとして持っているユーザーや、UNIXフラットファイル以外のメカニズム(LDAP、NIS、pam-pgsqlなど)でそのグループに追加されたユーザーを見逃してしまうでしょう。
もし、どうしても自分でやらなければならないのであれば、逆に
id
でシステム上の全ユーザーのグループを取得し(これは NSS から見えるすべてのソースを引き出します)、Perl かそれに似たものを使って、発見された各グループについてそのユーザーのメンバーシップを記すハッシュテーブルを維持します。
編集部:もちろん、これでも同じような問題があります。 私の拠点ではフラットファイルとLDAPしか使っていないので、両方の拠点からリストを取得すればいいのですが、あなたの環境ではそうではないかもしれませんね。
編集2:ふとしたことで思い出した人がいるのですが
getent passwd
は、LDAP/NIS/その他からのものを含む、システム上のすべてのユーザーのリストを返します。
しかし
getent group
を実行しても、デフォルトのグループエントリを介してのみメンバーであるユーザーを見逃してしまうので、このハックを書くことにしました。
#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Copyright © 2010-2013 by Zed Pobre ([email protected] or [email protected])
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
use strict; use warnings;
$ENV{"PATH"} = "/usr/bin:/bin";
my $wantedgroup = shift;
my %groupmembers;
my $usertext = `getent passwd`;
my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
foreach my $userid (@users)
{
my $usergrouptext = `id -Gn $userid`;
my @grouplist = split(' ',$usergrouptext);
foreach my $group (@grouplist)
{
$groupmembers{$group}->{$userid} = 1;
}
}
if($wantedgroup)
{
print_group_members($wantedgroup);
}
else
{
foreach my $group (sort keys %groupmembers)
{
print "Group ",$group," has the following members:\n";
print_group_members($group);
print "\n";
}
}
sub print_group_members
{
my ($group) = @_;
return unless $group;
foreach my $member (sort keys %{$groupmembers{$group}})
{
print $member,"\n";
}
}
関連
-
[解決済み】スラッシュとrsyncコマンド
-
[解決済み] Gccコンパイル "オブジェクトファイルのサフィックスを計算できない: コンパイルできない"
-
[解決済み] Linux の設定 -- ssmtp: smtp.gmail.com:587 を開くことができません。
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] フォルダとそのサブフォルダ/ファイルのパーミッションを一括で変更する方法
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] すべてのディレクトリとサブディレクトリを再帰的にgrepするにはどうしたらいいですか?
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] pkg-configが見つからないエラー
-
[解決済み] sysrootとは何ですか、そしてどのように作成しますか?
-
[解決済み】git clone時に「'https'のリモートヘルパーが見つかりません。
-
[解決済み] FIN_WAIT1とはどのような意味ですか?
-
[解決済み] 圧縮データが無効です。
-
[解決済み] ユーザーデータスクリプトは私のカスタムAMIでは動作しませんが、標準のAmazon linuxでは動作しています。
-
[解決済み] Tarエラーです。アーカイブ内の予期しないEOF
-
[解決済み] Vimを保存して終了するにはどうしたらいいですか?
-
[解決済み] grepコマンドで特定の列にマッチングさせる
-
[解決済み] Grep ディレクトリ内のすべてのファイルを文字列1および文字列2で検索します。