web-dev-qa-db-ja.com

Imが現在ユーザーとしてログインしている場合、 `groups`からの出力が` groups user`と異なるのはなぜですか?

以下の出力が異なる理由がわかりません。私の理解では、ユーザーを指定しないグループは、現在ログインしているユーザーがメンバーであるすべてのグループを提供します。

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob

また、「現在のプロセスのグループ」(グループのマニュアルページから)とはどういう意味ですか?彼らはどこに設置されていますか?

注:私のディストリビューションはUbuntuです。

21
Jake

次のいずれかになります。

  • それはバグかもしれません(私はそれを疑っていますが)
  • ログアウトして再度ログインする必要がある場合があります

グループは/etc/groupで設定されます。

12
cnicutar

すべてのプロセスに現在の実際の有効なユーザーIDと実際の有効なグループIDがあるのと同様に、 補足グループのリスト もあります。これらはnumbers(名前ではありません)すべてカーネルによって維持されます。これらは、ユーザーIDと同様に、ログイン時にログインプロセス(またはディスプレイマネージャー)によって設定されます。これらは、ユーザーIDと同様に、サブプロセスによって継承されます。

引数なしでgroupsを実行すると、最終的に getgroups() が呼び出され、カーネルから補足グループリストが取得されます。 (私のLinuxシステムでは、/ usr/bin/groupsは「id-Gn」を実行するシェルスクリプトであり、これによりgetgroups()が呼び出されます。)

groups usernameを実行すると、コマンドは、そのユーザーがログインしたときに補足グループがどうなるかを「推測」する必要があります。これは通常、/ etc/groupを読み取るか、NISに話しかけるか、nscdに話しかけるか...まあ、それが機能するかもしれない多くの方法があります。

観察していることは、現在の実際のユーザーIDと/ etc/passwdのエントリに一貫性がないことを発見することに似ています。これは、システムの構成に少し奇妙なことがあることを意味しますが、さらに調査しなければ何を言うのは難しいです。

8
Nemo

(備考:groupsコマンドは、まだ便利ですが、ほとんどの場合、 idコマンド に置き換えられています。)

ユーザーには、ログインに使用するファイル/etc/passwdファイルで従来定義されているプラ​​イマリグループがありますが、現在は他のソースがある可能性があります。彼は、従来はファイル/etc/groupsで指定されていた、セカンダリグループまたは補足グループと呼ばれる追加グループのメンバーである場合もありますが、今日では、追加ソース(NIS、LDAP、SAMBAなど)から取得または暗示されることもあります。 )。

プライマリグループと補足グループはログイン時に定義され、currentのままです。ただし、ユーザーはnewgrpコマンドを使用して、いつでも現在アクティブなプライマリグループを変更できます。

ログインプロセスにより、プライマリグループと補足グループが設定されます。後者の場合、通常はlibc関数 initgroups を呼び出します。この関数は、補足グループデータのリストをコンパイルし、それを setgroups 関数に渡します。この関数は、処理する。

initgroupsの情報源は次のとおりです。

GNU Cライブラリおよびその他の特定のアプリケーションが、さまざまなカテゴリのネームサービス情報を取得するソースを決定するために使用します。情報の各カテゴリは、データベース名。

groupsコマンドは、グループを現在ユーザーに適用されているとして表示し、リストは現在のプライマリグループに続いて、ログイン時からの補足グループ。ログイン後からのデータのソースへの変更は、表示されるリストに反映されません。

groups usernameコマンドは、Linuxにそのユーザーのグループを計算するように要求します。これは、主にファイル/etc/password/etc/groupsそして追加のソース。これはシステムファイルの現在の状況を反映し、ログイン時からまだ有効な現在のグループと等しくない場合があります。

groups usernameコマンドは、ログインプロセスが補足グループの計算に使用したすべてのソースを使用しない場合、異なる結果をもたらす可能性があります。これは、明らかにあなたの場合に起こったことです。これらのソースは、ログインからアクセスできない場合や、コマンドによって参照されない場合があります。

id usernameコマンドを使用すると、より良い結果が得られる場合がありますが、ログインプロセスほど完全であるとは限りません。 idコマンドは、古いgroupsコマンドよりも新しいものであり、より正確であることが意図されていました。

groupsコマンドは正確で正しい結果を提供しますが、groups usernameコマンドに依存して同じことを行うことはできないことを十分に示しています。

groupsコマンドのソースコードを調べずに、Linuxディストリビューションでのgroups usernameコマンドの実装は/etc/groupsを分析すると思いますが、あなたの場合は何も含まれていませんが、すべての補足グループの元となった/etc/nsswitch.confは使用しないでください。したがって、プライマリグループ名jacobのみが表示されます。

詳細については、以下を参照してください。

3
harrymc